jquery.js ➔ jQuerySub   F
last analyzed

Complexity

Conditions 155

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 155
eloc 2
dl 0
loc 3
rs 0
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like jquery.js ➔ jQuerySub often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/*!
2
 * jQuery JavaScript Library v1.7.1
3
 * http://jquery.com/
4
 *
5
 * Copyright 2011, John Resig
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
7
 * http://jquery.org/license
8
 *
9
 * Includes Sizzle.js
10
 * http://sizzlejs.com/
11
 * Copyright 2011, The Dojo Foundation
12
 * Released under the MIT, BSD, and GPL Licenses.
13
 *
14
 * Date: Mon Nov 21 21:11:03 2011 -0500
15
 */
16
(function( window, undefined ) {
17
18
// Use the correct document accordingly with window argument (sandbox)
19
var document = window.document,
20
	navigator = window.navigator,
21
	location = window.location;
22
var jQuery = (function() {
23
24
// Define a local copy of jQuery
25
var jQuery = function( selector, context ) {
26
		// The jQuery object is actually just the init constructor 'enhanced'
27
		return new jQuery.fn.init( selector, context, rootjQuery );
28
	},
29
30
	// Map over jQuery in case of overwrite
31
	_jQuery = window.jQuery,
32
33
	// Map over the $ in case of overwrite
34
	_$ = window.$,
35
36
	// A central reference to the root jQuery(document)
37
	rootjQuery,
38
39
	// A simple way to check for HTML strings or ID strings
40
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
41
	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
42
43
	// Check if a string has a non-whitespace character in it
44
	rnotwhite = /\S/,
45
46
	// Used for trimming whitespace
47
	trimLeft = /^\s+/,
48
	trimRight = /\s+$/,
49
50
	// Match a standalone tag
51
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
52
53
	// JSON RegExp
54
	rvalidchars = /^[\],:{}\s]*$/,
55
	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
56
	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
57
	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
58
59
	// Useragent RegExp
60
	rwebkit = /(webkit)[ \/]([\w.]+)/,
61
	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
62
	rmsie = /(msie) ([\w.]+)/,
63
	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
64
65
	// Matches dashed string for camelizing
66
	rdashAlpha = /-([a-z]|[0-9])/ig,
67
	rmsPrefix = /^-ms-/,
68
69
	// Used by jQuery.camelCase as callback to replace()
70
	fcamelCase = function( all, letter ) {
71
		return ( letter + "" ).toUpperCase();
72
	},
73
74
	// Keep a UserAgent string for use with jQuery.browser
75
	userAgent = navigator.userAgent,
76
77
	// For matching the engine and version of the browser
78
	browserMatch,
79
80
	// The deferred used on DOM ready
81
	readyList,
82
83
	// The ready event handler
84
	DOMContentLoaded,
85
86
	// Save a reference to some core methods
87
	toString = Object.prototype.toString,
88
	hasOwn = Object.prototype.hasOwnProperty,
89
	push = Array.prototype.push,
90
	slice = Array.prototype.slice,
91
	trim = String.prototype.trim,
92
	indexOf = Array.prototype.indexOf,
93
94
	// [[Class]] -> type pairs
95
	class2type = {};
96
97
jQuery.fn = jQuery.prototype = {
98
	constructor: jQuery,
99 View Code Duplication
	init: function( selector, context, rootjQuery ) {
100
		var match, elem, ret, doc;
101
102
		// Handle $(""), $(null), or $(undefined)
103
		if ( !selector ) {
104
			return this;
105
		}
106
107
		// Handle $(DOMElement)
108
		if ( selector.nodeType ) {
109
			this.context = this[0] = selector;
110
			this.length = 1;
111
			return this;
112
		}
113
114
		// The body element only exists once, optimize finding it
115
		if ( selector === "body" && !context && document.body ) {
116
			this.context = document;
117
			this[0] = document.body;
118
			this.selector = selector;
119
			this.length = 1;
120
			return this;
121
		}
122
123
		// Handle HTML strings
124
		if ( typeof selector === "string" ) {
125
			// Are we dealing with HTML string or an ID?
126
			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
127
				// Assume that strings that start and end with <> are HTML and skip the regex check
128
				match = [ null, selector, null ];
129
130
			} else {
131
				match = quickExpr.exec( selector );
132
			}
133
134
			// Verify a match, and that no context was specified for #id
135
			if ( match && (match[1] || !context) ) {
136
137
				// HANDLE: $(html) -> $(array)
138
				if ( match[1] ) {
139
					context = context instanceof jQuery ? context[0] : context;
140
					doc = ( context ? context.ownerDocument || context : document );
141
142
					// If a single string is passed in and it's a single tag
143
					// just do a createElement and skip the rest
144
					ret = rsingleTag.exec( selector );
145
146
					if ( ret ) {
147
						if ( jQuery.isPlainObject( context ) ) {
148
							selector = [ document.createElement( ret[1] ) ];
149
							jQuery.fn.attr.call( selector, context, true );
150
151
						} else {
152
							selector = [ doc.createElement( ret[1] ) ];
153
						}
154
155
					} else {
156
						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
157
						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
158
					}
159
160
					return jQuery.merge( this, selector );
161
162
				// HANDLE: $("#id")
163
				} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
164
					elem = document.getElementById( match[2] );
165
166
					// Check parentNode to catch when Blackberry 4.6 returns
167
					// nodes that are no longer in the document #6963
168
					if ( elem && elem.parentNode ) {
169
						// Handle the case where IE and Opera return items
170
						// by name instead of ID
171
						if ( elem.id !== match[2] ) {
172
							return rootjQuery.find( selector );
173
						}
174
175
						// Otherwise, we inject the element directly into the jQuery object
176
						this.length = 1;
177
						this[0] = elem;
178
					}
179
180
					this.context = document;
181
					this.selector = selector;
182
					return this;
183
				}
184
185
			// HANDLE: $(expr, $(...))
186
			} else if ( !context || context.jquery ) {
187
				return ( context || rootjQuery ).find( selector );
188
189
			// HANDLE: $(expr, context)
190
			// (which is just equivalent to: $(context).find(expr)
191
			} else {
192
				return this.constructor( context ).find( selector );
193
			}
194
195
		// HANDLE: $(function)
196
		// Shortcut for document ready
197
		} else if ( jQuery.isFunction( selector ) ) {
198
			return rootjQuery.ready( selector );
199
		}
200
201
		if ( selector.selector !== undefined ) {
202
			this.selector = selector.selector;
203
			this.context = selector.context;
204
		}
205
206
		return jQuery.makeArray( selector, this );
207
	},
208
209
	// Start with an empty selector
210
	selector: "",
211
212
	// The current version of jQuery being used
213
	jquery: "1.7.1",
214
215
	// The default length of a jQuery object is 0
216
	length: 0,
217
218
	// The number of elements contained in the matched element set
219
	size: function() {
220
		return this.length;
221
	},
222
223
	toArray: function() {
224
		return slice.call( this, 0 );
225
	},
226
227
	// Get the Nth element in the matched element set OR
228
	// Get the whole matched element set as a clean array
229
	get: function( num ) {
230
		return num == null ?
231
232
			// Return a 'clean' array
233
			this.toArray() :
234
235
			// Return just the object
236
			( num < 0 ? this[ this.length + num ] : this[ num ] );
237
	},
238
239
	// Take an array of elements and push it onto the stack
240
	// (returning the new matched element set)
241 View Code Duplication
	pushStack: function( elems, name, selector ) {
242
		// Build a new jQuery matched element set
243
		var ret = this.constructor();
244
245
		if ( jQuery.isArray( elems ) ) {
246
			push.apply( ret, elems );
247
248
		} else {
249
			jQuery.merge( ret, elems );
250
		}
251
252
		// Add the old object onto the stack (as a reference)
253
		ret.prevObject = this;
254
255
		ret.context = this.context;
256
257
		if ( name === "find" ) {
258
			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
259
		} else if ( name ) {
260
			ret.selector = this.selector + "." + name + "(" + selector + ")";
261
		}
262
263
		// Return the newly-formed element set
264
		return ret;
265
	},
266
267
	// Execute a callback for every element in the matched set.
268
	// (You can seed the arguments with an array of args, but this is
269
	// only used internally.)
270
	each: function( callback, args ) {
271
		return jQuery.each( this, callback, args );
272
	},
273
274
	ready: function( fn ) {
275
		// Attach the listeners
276
		jQuery.bindReady();
277
278
		// Add the callback
279
		readyList.add( fn );
280
281
		return this;
282
	},
283
284
	eq: function( i ) {
285
		i = +i;
286
		return i === -1 ?
287
			this.slice( i ) :
288
			this.slice( i, i + 1 );
289
	},
290
291
	first: function() {
292
		return this.eq( 0 );
293
	},
294
295
	last: function() {
296
		return this.eq( -1 );
297
	},
298
299
	slice: function() {
300
		return this.pushStack( slice.apply( this, arguments ),
301
			"slice", slice.call(arguments).join(",") );
302
	},
303
304
	map: function( callback ) {
305
		return this.pushStack( jQuery.map(this, function( elem, i ) {
306
			return callback.call( elem, i, elem );
307
		}));
308
	},
309
310
	end: function() {
311
		return this.prevObject || this.constructor(null);
312
	},
313
314
	// For internal use only.
315
	// Behaves like an Array's method, not like a jQuery method.
316
	push: push,
317
	sort: [].sort,
318
	splice: [].splice
319
};
320
321
// Give the init function the jQuery prototype for later instantiation
322
jQuery.fn.init.prototype = jQuery.fn;
323
324 View Code Duplication
jQuery.extend = jQuery.fn.extend = function() {
325
	var options, name, src, copy, copyIsArray, clone,
326
		target = arguments[0] || {},
327
		i = 1,
328
		length = arguments.length,
329
		deep = false;
330
331
	// Handle a deep copy situation
332
	if ( typeof target === "boolean" ) {
333
		deep = target;
334
		target = arguments[1] || {};
335
		// skip the boolean and the target
336
		i = 2;
337
	}
338
339
	// Handle case when target is a string or something (possible in deep copy)
340
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
341
		target = {};
342
	}
343
344
	// extend jQuery itself if only one argument is passed
345
	if ( length === i ) {
346
		target = this;
347
		--i;
348
	}
349
350
	for ( ; i < length; i++ ) {
351
		// Only deal with non-null/undefined values
352
		if ( (options = arguments[ i ]) != null ) {
353
			// Extend the base object
354
			for ( name in options ) {
355
				src = target[ name ];
356
				copy = options[ name ];
357
358
				// Prevent never-ending loop
359
				if ( target === copy ) {
360
					continue;
361
				}
362
363
				// Recurse if we're merging plain objects or arrays
364
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
365
					if ( copyIsArray ) {
366
						copyIsArray = false;
367
						clone = src && jQuery.isArray(src) ? src : [];
368
369
					} else {
370
						clone = src && jQuery.isPlainObject(src) ? src : {};
371
					}
372
373
					// Never move original objects, clone them
374
					target[ name ] = jQuery.extend( deep, clone, copy );
375
376
				// Don't bring in undefined values
377
				} else if ( copy !== undefined ) {
378
					target[ name ] = copy;
379
				}
380
			}
381
		}
382
	}
383
384
	// Return the modified object
385
	return target;
386
};
387
388
jQuery.extend({
389
	noConflict: function( deep ) {
390
		if ( window.$ === jQuery ) {
391
			window.$ = _$;
392
		}
393
394
		if ( deep && window.jQuery === jQuery ) {
395
			window.jQuery = _jQuery;
396
		}
397
398
		return jQuery;
399
	},
400
401
	// Is the DOM ready to be used? Set to true once it occurs.
402
	isReady: false,
403
404
	// A counter to track how many items to wait for before
405
	// the ready event fires. See #6781
406
	readyWait: 1,
407
408
	// Hold (or release) the ready event
409
	holdReady: function( hold ) {
410
		if ( hold ) {
411
			jQuery.readyWait++;
412
		} else {
413
			jQuery.ready( true );
414
		}
415
	},
416
417
	// Handle when the DOM is ready
418
	ready: function( wait ) {
419
		// Either a released hold or an DOMready/load event and not yet ready
420
		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
421
			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
422
			if ( !document.body ) {
423
				return setTimeout( jQuery.ready, 1 );
424
			}
425
426
			// Remember that the DOM is ready
427
			jQuery.isReady = true;
428
429
			// If a normal DOM Ready event fired, decrement, and wait if need be
430
			if ( wait !== true && --jQuery.readyWait > 0 ) {
431
				return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
432
			}
433
434
			// If there are functions bound, to execute
435
			readyList.fireWith( document, [ jQuery ] );
436
437
			// Trigger any bound ready events
438
			if ( jQuery.fn.trigger ) {
439
				jQuery( document ).trigger( "ready" ).off( "ready" );
440
			}
441
		}
442
	},
443
444 View Code Duplication
	bindReady: function() {
445
		if ( readyList ) {
446
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
447
		}
448
449
		readyList = jQuery.Callbacks( "once memory" );
450
451
		// Catch cases where $(document).ready() is called after the
452
		// browser event has already occurred.
453
		if ( document.readyState === "complete" ) {
454
			// Handle it asynchronously to allow scripts the opportunity to delay ready
455
			return setTimeout( jQuery.ready, 1 );
456
		}
457
458
		// Mozilla, Opera and webkit nightlies currently support this event
459
		if ( document.addEventListener ) {
460
			// Use the handy event callback
461
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
462
463
			// A fallback to window.onload, that will always work
464
			window.addEventListener( "load", jQuery.ready, false );
465
466
		// If IE event model is used
467
		} else if ( document.attachEvent ) {
468
			// ensure firing before onload,
469
			// maybe late but safe also for iframes
470
			document.attachEvent( "onreadystatechange", DOMContentLoaded );
471
472
			// A fallback to window.onload, that will always work
473
			window.attachEvent( "onload", jQuery.ready );
474
475
			// If IE and not a frame
476
			// continually check to see if the document is ready
477
			var toplevel = false;
478
479
			try {
480
				toplevel = window.frameElement == null;
481
			} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
482
483
			if ( document.documentElement.doScroll && toplevel ) {
484
				doScrollCheck();
485
			}
486
		}
487
	},
488
489
	// See test/unit/core.js for details concerning isFunction.
490
	// Since version 1.3, DOM methods and functions like alert
491
	// aren't supported. They return false on IE (#2968).
492
	isFunction: function( obj ) {
493
		return jQuery.type(obj) === "function";
494
	},
495
496
	isArray: Array.isArray || function( obj ) {
497
		return jQuery.type(obj) === "array";
498
	},
499
500
	// A crude way of determining if an object is a window
501
	isWindow: function( obj ) {
502
		return obj && typeof obj === "object" && "setInterval" in obj;
503
	},
504
505
	isNumeric: function( obj ) {
506
		return !isNaN( parseFloat(obj) ) && isFinite( obj );
507
	},
508
509
	type: function( obj ) {
510
		return obj == null ?
511
			String( obj ) :
512
			class2type[ toString.call(obj) ] || "object";
513
	},
514
515 View Code Duplication
	isPlainObject: function( obj ) {
516
		// Must be an Object.
517
		// Because of IE, we also have to check the presence of the constructor property.
518
		// Make sure that DOM nodes and window objects don't pass through, as well
519
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
520
			return false;
521
		}
522
523
		try {
524
			// Not own constructor property must be Object
525
			if ( obj.constructor &&
526
				!hasOwn.call(obj, "constructor") &&
527
				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
528
				return false;
529
			}
530
		} catch ( e ) {
531
			// IE8,9 Will throw exceptions on certain host objects #9897
532
			return false;
533
		}
534
535
		// Own properties are enumerated firstly, so to speed up,
536
		// if last one is own, then all properties are own.
537
538
		var key;
539
		for ( key in obj ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
540
541
		return key === undefined || hasOwn.call( obj, key );
542
	},
543
544
	isEmptyObject: function( obj ) {
545
		for ( var name in obj ) {
546
			return false;
547
		}
548
		return true;
549
	},
550
551
	error: function( msg ) {
552
		throw new Error( msg );
553
	},
554
555
	parseJSON: function( data ) {
556
		if ( typeof data !== "string" || !data ) {
557
			return null;
558
		}
559
560
		// Make sure leading/trailing whitespace is removed (IE can't handle it)
561
		data = jQuery.trim( data );
562
563
		// Attempt to parse using the native JSON parser first
564
		if ( window.JSON && window.JSON.parse ) {
565
			return window.JSON.parse( data );
566
		}
567
568
		// Make sure the incoming data is actual JSON
569
		// Logic borrowed from http://json.org/json2.js
570
		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
571
			.replace( rvalidtokens, "]" )
572
			.replace( rvalidbraces, "")) ) {
573
574
			return ( new Function( "return " + data ) )();
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
575
576
		}
577
		jQuery.error( "Invalid JSON: " + data );
578
	},
579
580
	// Cross-browser xml parsing
581
	parseXML: function( data ) {
582
		var xml, tmp;
583
		try {
584
			if ( window.DOMParser ) { // Standard
585
				tmp = new DOMParser();
586
				xml = tmp.parseFromString( data , "text/xml" );
587
			} else { // IE
588
				xml = new ActiveXObject( "Microsoft.XMLDOM" );
589
				xml.async = "false";
590
				xml.loadXML( data );
591
			}
592
		} catch( e ) {
593
			xml = undefined;
594
		}
595
		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
596
			jQuery.error( "Invalid XML: " + data );
597
		}
598
		return xml;
599
	},
600
601
	noop: function() {},
602
603
	// Evaluates a script in a global context
604
	// Workarounds based on findings by Jim Driscoll
605
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
606
	globalEval: function( data ) {
607
		if ( data && rnotwhite.test( data ) ) {
608
			// We use execScript on Internet Explorer
609
			// We use an anonymous function so that context is window
610
			// rather than jQuery in Firefox
611
			( window.execScript || function( data ) {
612
				window[ "eval" ].call( window, data );
613
			} )( data );
614
		}
615
	},
616
617
	// Convert dashed to camelCase; used by the css and data modules
618
	// Microsoft forgot to hump their vendor prefix (#9572)
619
	camelCase: function( string ) {
620
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
621
	},
622
623
	nodeName: function( elem, name ) {
624
		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
625
	},
626
627
	// args is for internal usage only
628
	each: function( object, callback, args ) {
629
		var name, i = 0,
630
			length = object.length,
631
			isObj = length === undefined || jQuery.isFunction( object );
632
633
		if ( args ) {
634
			if ( isObj ) {
635
				for ( name in object ) {
636
					if ( callback.apply( object[ name ], args ) === false ) {
637
						break;
638
					}
639
				}
640
			} else {
641
				for ( ; i < length; ) {
642
					if ( callback.apply( object[ i++ ], args ) === false ) {
643
						break;
644
					}
645
				}
646
			}
647
648
		// A special, fast, case for the most common use of each
649
		} else {
650
			if ( isObj ) {
651
				for ( name in object ) {
652
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
653
						break;
654
					}
655
				}
656
			} else {
657
				for ( ; i < length; ) {
658
					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
659
						break;
660
					}
661
				}
662
			}
663
		}
664
665
		return object;
666
	},
667
668
	// Use native String.trim function wherever possible
669
	trim: trim ?
670
		function( text ) {
671
			return text == null ?
672
				"" :
673
				trim.call( text );
674
		} :
675
676
		// Otherwise use our own trimming functionality
677
		function( text ) {
678
			return text == null ?
679
				"" :
680
				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
681
		},
682
683
	// results is for internal usage only
684 View Code Duplication
	makeArray: function( array, results ) {
685
		var ret = results || [];
686
687
		if ( array != null ) {
688
			// The window, strings (and functions) also have 'length'
689
			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
690
			var type = jQuery.type( array );
691
692
			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
693
				push.call( ret, array );
694
			} else {
695
				jQuery.merge( ret, array );
696
			}
697
		}
698
699
		return ret;
700
	},
701
702
	inArray: function( elem, array, i ) {
703
		var len;
704
705
		if ( array ) {
706
			if ( indexOf ) {
707
				return indexOf.call( array, elem, i );
708
			}
709
710
			len = array.length;
711
			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
712
713
			for ( ; i < len; i++ ) {
714
				// Skip accessing in sparse arrays
715
				if ( i in array && array[ i ] === elem ) {
716
					return i;
717
				}
718
			}
719
		}
720
721
		return -1;
722
	},
723
724 View Code Duplication
	merge: function( first, second ) {
725
		var i = first.length,
726
			j = 0;
727
728
		if ( typeof second.length === "number" ) {
729
			for ( var l = second.length; j < l; j++ ) {
730
				first[ i++ ] = second[ j ];
731
			}
732
733
		} else {
734
			while ( second[j] !== undefined ) {
735
				first[ i++ ] = second[ j++ ];
736
			}
737
		}
738
739
		first.length = i;
740
741
		return first;
742
	},
743
744 View Code Duplication
	grep: function( elems, callback, inv ) {
745
		var ret = [], retVal;
746
		inv = !!inv;
747
748
		// Go through the array, only saving the items
749
		// that pass the validator function
750
		for ( var i = 0, length = elems.length; i < length; i++ ) {
751
			retVal = !!callback( elems[ i ], i );
752
			if ( inv !== retVal ) {
753
				ret.push( elems[ i ] );
754
			}
755
		}
756
757
		return ret;
758
	},
759
760
	// arg is for internal usage only
761
	map: function( elems, callback, arg ) {
762
		var value, key, ret = [],
763
			i = 0,
764
			length = elems.length,
765
			// jquery objects are treated as arrays
766
			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
767
768
		// Go through the array, translating each of the items to their
769
		if ( isArray ) {
770
			for ( ; i < length; i++ ) {
771
				value = callback( elems[ i ], i, arg );
772
773
				if ( value != null ) {
774
					ret[ ret.length ] = value;
775
				}
776
			}
777
778
		// Go through every key on the object,
779
		} else {
780
			for ( key in elems ) {
781
				value = callback( elems[ key ], key, arg );
782
783
				if ( value != null ) {
784
					ret[ ret.length ] = value;
785
				}
786
			}
787
		}
788
789
		// Flatten any nested arrays
790
		return ret.concat.apply( [], ret );
791
	},
792
793
	// A global GUID counter for objects
794
	guid: 1,
795
796
	// Bind a function to a context, optionally partially applying any
797
	// arguments.
798
	proxy: function( fn, context ) {
799
		if ( typeof context === "string" ) {
800
			var tmp = fn[ context ];
801
			context = fn;
802
			fn = tmp;
803
		}
804
805
		// Quick check to determine if target is callable, in the spec
806
		// this throws a TypeError, but we will just return undefined.
807
		if ( !jQuery.isFunction( fn ) ) {
808
			return undefined;
809
		}
810
811
		// Simulated bind
812
		var args = slice.call( arguments, 2 ),
813
			proxy = function() {
814
				return fn.apply( context, args.concat( slice.call( arguments ) ) );
815
			};
816
817
		// Set the guid of unique handler to the same of original handler, so it can be removed
818
		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
819
820
		return proxy;
821
	},
822
823
	// Mutifunctional method to get and set values to a collection
824
	// The value/s can optionally be executed if it's a function
825 View Code Duplication
	access: function( elems, key, value, exec, fn, pass ) {
826
		var length = elems.length;
827
828
		// Setting many attributes
829
		if ( typeof key === "object" ) {
830
			for ( var k in key ) {
831
				jQuery.access( elems, k, key[k], exec, fn, value );
832
			}
833
			return elems;
834
		}
835
836
		// Setting one attribute
837
		if ( value !== undefined ) {
838
			// Optionally, function values get executed if exec is true
839
			exec = !pass && exec && jQuery.isFunction(value);
840
841
			for ( var i = 0; i < length; i++ ) {
842
				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
843
			}
844
845
			return elems;
846
		}
847
848
		// Getting an attribute
849
		return length ? fn( elems[0], key ) : undefined;
850
	},
851
852
	now: function() {
853
		return ( new Date() ).getTime();
854
	},
855
856
	// Use of jQuery.browser is frowned upon.
857
	// More details: http://docs.jquery.com/Utilities/jQuery.browser
858
	uaMatch: function( ua ) {
859
		ua = ua.toLowerCase();
860
861
		var match = rwebkit.exec( ua ) ||
862
			ropera.exec( ua ) ||
863
			rmsie.exec( ua ) ||
864
			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
865
			[];
866
867
		return { browser: match[1] || "", version: match[2] || "0" };
868
	},
869
870
	sub: function() {
871
		function jQuerySub( selector, context ) {
872
			return new jQuerySub.fn.init( selector, context );
873
		}
874
		jQuery.extend( true, jQuerySub, this );
875
		jQuerySub.superclass = this;
876
		jQuerySub.fn = jQuerySub.prototype = this();
877
		jQuerySub.fn.constructor = jQuerySub;
878
		jQuerySub.sub = this.sub;
879
		jQuerySub.fn.init = function init( selector, context ) {
880
			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
881
				context = jQuerySub( context );
882
			}
883
884
			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
885
		};
886
		jQuerySub.fn.init.prototype = jQuerySub.fn;
887
		var rootjQuerySub = jQuerySub(document);
888
		return jQuerySub;
889
	},
890
891
	browser: {}
892
});
893
894
// Populate the class2type map
895
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
896
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
897
});
898
899
browserMatch = jQuery.uaMatch( userAgent );
900
if ( browserMatch.browser ) {
901
	jQuery.browser[ browserMatch.browser ] = true;
902
	jQuery.browser.version = browserMatch.version;
903
}
904
905
// Deprecated, use jQuery.browser.webkit instead
906
if ( jQuery.browser.webkit ) {
907
	jQuery.browser.safari = true;
908
}
909
910
// IE doesn't match non-breaking spaces with \s
911
if ( rnotwhite.test( "\xA0" ) ) {
912
	trimLeft = /^[\s\xA0]+/;
913
	trimRight = /[\s\xA0]+$/;
914
}
915
916
// All jQuery objects should point back to these
917
rootjQuery = jQuery(document);
918
919
// Cleanup functions for the document ready method
920
if ( document.addEventListener ) {
921
	DOMContentLoaded = function() {
922
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
923
		jQuery.ready();
924
	};
925
926
} else if ( document.attachEvent ) {
927
	DOMContentLoaded = function() {
928
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
929
		if ( document.readyState === "complete" ) {
930
			document.detachEvent( "onreadystatechange", DOMContentLoaded );
931
			jQuery.ready();
932
		}
933
	};
934
}
935
936
// The DOM ready check for Internet Explorer
937
function doScrollCheck() {
938
	if ( jQuery.isReady ) {
939
		return;
940
	}
941
942
	try {
943
		// If IE is used, use the trick by Diego Perini
944
		// http://javascript.nwbox.com/IEContentLoaded/
945
		document.documentElement.doScroll("left");
946
	} catch(e) {
947
		setTimeout( doScrollCheck, 1 );
948
		return;
949
	}
950
951
	// and execute any waiting functions
952
	jQuery.ready();
953
}
954
955
return jQuery;
956
957
})();
958
959
960
// String to Object flags format cache
961
var flagsCache = {};
962
963
// Convert String-formatted flags into Object-formatted ones and store in cache
964
function createFlags( flags ) {
965
	var object = flagsCache[ flags ] = {},
966
		i, length;
967
	flags = flags.split( /\s+/ );
968
	for ( i = 0, length = flags.length; i < length; i++ ) {
969
		object[ flags[i] ] = true;
970
	}
971
	return object;
972
}
973
974
/*
975
 * Create a callback list using the following parameters:
976
 *
977
 *	flags:	an optional list of space-separated flags that will change how
978
 *			the callback list behaves
979
 *
980
 * By default a callback list will act like an event callback list and can be
981
 * "fired" multiple times.
982
 *
983
 * Possible flags:
984
 *
985
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
986
 *
987
 *	memory:			will keep track of previous values and will call any callback added
988
 *					after the list has been fired right away with the latest "memorized"
989
 *					values (like a Deferred)
990
 *
991
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
992
 *
993
 *	stopOnFalse:	interrupt callings when a callback returns false
994
 *
995
 */
996
jQuery.Callbacks = function( flags ) {
997
998
	// Convert flags from String-formatted to Object-formatted
999
	// (we check in cache first)
1000
	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
1001
1002
	var // Actual callback list
1003
		list = [],
1004
		// Stack of fire calls for repeatable lists
1005
		stack = [],
1006
		// Last fire value (for non-forgettable lists)
1007
		memory,
1008
		// Flag to know if list is currently firing
1009
		firing,
1010
		// First callback to fire (used internally by add and fireWith)
1011
		firingStart,
1012
		// End of the loop when firing
1013
		firingLength,
1014
		// Index of currently firing callback (modified by remove if needed)
1015
		firingIndex,
1016
		// Add one or several callbacks to the list
1017
		add = function( args ) {
1018
			var i,
1019
				length,
1020
				elem,
1021
				type,
1022
				actual;
1023
			for ( i = 0, length = args.length; i < length; i++ ) {
1024
				elem = args[ i ];
1025
				type = jQuery.type( elem );
1026
				if ( type === "array" ) {
1027
					// Inspect recursively
1028
					add( elem );
1029
				} else if ( type === "function" ) {
1030
					// Add if not in unique mode and callback is not in
1031
					if ( !flags.unique || !self.has( elem ) ) {
1032
						list.push( elem );
1033
					}
1034
				}
1035
			}
1036
		},
1037
		// Fire callbacks
1038
		fire = function( context, args ) {
1039
			args = args || [];
1040
			memory = !flags.memory || [ context, args ];
1041
			firing = true;
1042
			firingIndex = firingStart || 0;
1043
			firingStart = 0;
1044
			firingLength = list.length;
1045
			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
0 ignored issues
show
Bug introduced by
The variable firingIndex is changed as part of the for loop for example by firingIndex++ on line 1045. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
1046
				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
1047
					memory = true; // Mark as halted
1048
					break;
1049
				}
1050
			}
1051
			firing = false;
1052
			if ( list ) {
1053
				if ( !flags.once ) {
1054
					if ( stack && stack.length ) {
1055
						memory = stack.shift();
1056
						self.fireWith( memory[ 0 ], memory[ 1 ] );
1057
					}
1058
				} else if ( memory === true ) {
1059
					self.disable();
1060
				} else {
1061
					list = [];
1062
				}
1063
			}
1064
		},
1065
		// Actual Callbacks object
1066
		self = {
1067
			// Add a callback or a collection of callbacks to the list
1068
			add: function() {
1069
				if ( list ) {
1070
					var length = list.length;
1071
					add( arguments );
1072
					// Do we need to add the callbacks to the
1073
					// current firing batch?
1074
					if ( firing ) {
1075
						firingLength = list.length;
1076
					// With memory, if we're not firing then
1077
					// we should call right away, unless previous
1078
					// firing was halted (stopOnFalse)
1079
					} else if ( memory && memory !== true ) {
1080
						firingStart = length;
1081
						fire( memory[ 0 ], memory[ 1 ] );
1082
					}
1083
				}
1084
				return this;
1085
			},
1086
			// Remove a callback from the list
1087
			remove: function() {
1088
				if ( list ) {
1089
					var args = arguments,
1090
						argIndex = 0,
1091
						argLength = args.length;
1092
					for ( ; argIndex < argLength ; argIndex++ ) {
1093
						for ( var i = 0; i < list.length; i++ ) {
1094
							if ( args[ argIndex ] === list[ i ] ) {
1095
								// Handle firingIndex and firingLength
1096
								if ( firing ) {
1097
									if ( i <= firingLength ) {
1098
										firingLength--;
1099
										if ( i <= firingIndex ) {
1100
											firingIndex--;
1101
										}
1102
									}
1103
								}
1104
								// Remove the element
1105
								list.splice( i--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
1106
								// If we have some unicity property then
1107
								// we only need to do this once
1108
								if ( flags.unique ) {
1109
									break;
1110
								}
1111
							}
1112
						}
1113
					}
1114
				}
1115
				return this;
1116
			},
1117
			// Control if a given callback is in the list
1118
			has: function( fn ) {
1119
				if ( list ) {
1120
					var i = 0,
1121
						length = list.length;
1122
					for ( ; i < length; i++ ) {
1123
						if ( fn === list[ i ] ) {
1124
							return true;
1125
						}
1126
					}
1127
				}
1128
				return false;
1129
			},
1130
			// Remove all callbacks from the list
1131
			empty: function() {
1132
				list = [];
1133
				return this;
1134
			},
1135
			// Have the list do nothing anymore
1136
			disable: function() {
1137
				list = stack = memory = undefined;
1138
				return this;
1139
			},
1140
			// Is it disabled?
1141
			disabled: function() {
1142
				return !list;
1143
			},
1144
			// Lock the list in its current state
1145
			lock: function() {
1146
				stack = undefined;
1147
				if ( !memory || memory === true ) {
1148
					self.disable();
1149
				}
1150
				return this;
1151
			},
1152
			// Is it locked?
1153
			locked: function() {
1154
				return !stack;
1155
			},
1156
			// Call all callbacks with the given context and arguments
1157
			fireWith: function( context, args ) {
1158
				if ( stack ) {
1159
					if ( firing ) {
1160
						if ( !flags.once ) {
1161
							stack.push( [ context, args ] );
1162
						}
1163
					} else if ( !( flags.once && memory ) ) {
1164
						fire( context, args );
1165
					}
1166
				}
1167
				return this;
1168
			},
1169
			// Call all the callbacks with the given arguments
1170
			fire: function() {
1171
				self.fireWith( this, arguments );
1172
				return this;
1173
			},
1174
			// To know if the callbacks have already been called at least once
1175
			fired: function() {
1176
				return !!memory;
1177
			}
1178
		};
1179
1180
	return self;
1181
};
1182
1183
1184
1185
1186
var // Static reference to slice
1187
	sliceDeferred = [].slice;
1188
1189
jQuery.extend({
1190
1191
	Deferred: function( func ) {
1192
		var doneList = jQuery.Callbacks( "once memory" ),
1193
			failList = jQuery.Callbacks( "once memory" ),
1194
			progressList = jQuery.Callbacks( "memory" ),
1195
			state = "pending",
1196
			lists = {
1197
				resolve: doneList,
1198
				reject: failList,
1199
				notify: progressList
1200
			},
1201
			promise = {
1202
				done: doneList.add,
1203
				fail: failList.add,
1204
				progress: progressList.add,
1205
1206
				state: function() {
1207
					return state;
1208
				},
1209
1210
				// Deprecated
1211
				isResolved: doneList.fired,
1212
				isRejected: failList.fired,
1213
1214
				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
1215
					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
1216
					return this;
1217
				},
1218
				always: function() {
1219
					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
1220
					return this;
1221
				},
1222
				pipe: function( fnDone, fnFail, fnProgress ) {
1223
					return jQuery.Deferred(function( newDefer ) {
1224
						jQuery.each( {
1225
							done: [ fnDone, "resolve" ],
1226
							fail: [ fnFail, "reject" ],
1227
							progress: [ fnProgress, "notify" ]
1228
						}, function( handler, data ) {
1229
							var fn = data[ 0 ],
1230
								action = data[ 1 ],
1231
								returned;
1232
							if ( jQuery.isFunction( fn ) ) {
1233
								deferred[ handler ](function() {
1234
									returned = fn.apply( this, arguments );
1235
									if ( returned && jQuery.isFunction( returned.promise ) ) {
1236
										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
1237
									} else {
1238
										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
1239
									}
1240
								});
1241
							} else {
1242
								deferred[ handler ]( newDefer[ action ] );
1243
							}
1244
						});
1245
					}).promise();
1246
				},
1247
				// Get a promise for this deferred
1248
				// If obj is provided, the promise aspect is added to the object
1249
				promise: function( obj ) {
1250
					if ( obj == null ) {
1251
						obj = promise;
1252
					} else {
1253
						for ( var key in promise ) {
1254
							obj[ key ] = promise[ key ];
1255
						}
1256
					}
1257
					return obj;
1258
				}
1259
			},
1260
			deferred = promise.promise({}),
1261
			key;
1262
1263
		for ( key in lists ) {
1264
			deferred[ key ] = lists[ key ].fire;
1265
			deferred[ key + "With" ] = lists[ key ].fireWith;
1266
		}
1267
1268
		// Handle state
1269
		deferred.done( function() {
1270
			state = "resolved";
1271
		}, failList.disable, progressList.lock ).fail( function() {
1272
			state = "rejected";
1273
		}, doneList.disable, progressList.lock );
1274
1275
		// Call given func if any
1276
		if ( func ) {
1277
			func.call( deferred, deferred );
1278
		}
1279
1280
		// All done!
1281
		return deferred;
1282
	},
1283
1284
	// Deferred helper
1285
	when: function( firstParam ) {
1286
		var args = sliceDeferred.call( arguments, 0 ),
1287
			i = 0,
1288
			length = args.length,
1289
			pValues = new Array( length ),
1290
			count = length,
1291
			pCount = length,
1292
			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1293
				firstParam :
1294
				jQuery.Deferred(),
1295
			promise = deferred.promise();
1296
		function resolveFunc( i ) {
1297
			return function( value ) {
1298
				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1299
				if ( !( --count ) ) {
1300
					deferred.resolveWith( deferred, args );
1301
				}
1302
			};
1303
		}
1304
		function progressFunc( i ) {
1305
			return function( value ) {
1306
				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1307
				deferred.notifyWith( promise, pValues );
1308
			};
1309
		}
1310
		if ( length > 1 ) {
1311
			for ( ; i < length; i++ ) {
1312
				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
1313
					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
1314
				} else {
1315
					--count;
1316
				}
1317
			}
1318
			if ( !count ) {
1319
				deferred.resolveWith( deferred, args );
1320
			}
1321
		} else if ( deferred !== firstParam ) {
1322
			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1323
		}
1324
		return promise;
1325
	}
1326
});
1327
1328
1329
1330
1331
jQuery.support = (function() {
1332
1333
	var support,
1334
		all,
1335
		a,
1336
		select,
1337
		opt,
1338
		input,
1339
		marginDiv,
1340
		fragment,
1341
		tds,
1342
		events,
1343
		eventName,
1344
		i,
1345
		isSupported,
1346
		div = document.createElement( "div" ),
1347
		documentElement = document.documentElement;
1348
1349
	// Preliminary tests
1350
	div.setAttribute("className", "t");
1351
	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1352
1353
	all = div.getElementsByTagName( "*" );
1354
	a = div.getElementsByTagName( "a" )[ 0 ];
1355
1356
	// Can't get basic test support
1357
	if ( !all || !all.length || !a ) {
1358
		return {};
1359
	}
1360
1361
	// First batch of supports tests
1362
	select = document.createElement( "select" );
1363
	opt = select.appendChild( document.createElement("option") );
1364
	input = div.getElementsByTagName( "input" )[ 0 ];
1365
1366
	support = {
1367
		// IE strips leading whitespace when .innerHTML is used
1368
		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1369
1370
		// Make sure that tbody elements aren't automatically inserted
1371
		// IE will insert them into empty tables
1372
		tbody: !div.getElementsByTagName("tbody").length,
1373
1374
		// Make sure that link elements get serialized correctly by innerHTML
1375
		// This requires a wrapper element in IE
1376
		htmlSerialize: !!div.getElementsByTagName("link").length,
1377
1378
		// Get the style information from getAttribute
1379
		// (IE uses .cssText instead)
1380
		style: /top/.test( a.getAttribute("style") ),
1381
1382
		// Make sure that URLs aren't manipulated
1383
		// (IE normalizes it by default)
1384
		hrefNormalized: ( a.getAttribute("href") === "/a" ),
1385
1386
		// Make sure that element opacity exists
1387
		// (IE uses filter instead)
1388
		// Use a regex to work around a WebKit issue. See #5145
1389
		opacity: /^0.55/.test( a.style.opacity ),
1390
1391
		// Verify style float existence
1392
		// (IE uses styleFloat instead of cssFloat)
1393
		cssFloat: !!a.style.cssFloat,
1394
1395
		// Make sure that if no value is specified for a checkbox
1396
		// that it defaults to "on".
1397
		// (WebKit defaults to "" instead)
1398
		checkOn: ( input.value === "on" ),
1399
1400
		// Make sure that a selected-by-default option has a working selected property.
1401
		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1402
		optSelected: opt.selected,
1403
1404
		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1405
		getSetAttribute: div.className !== "t",
1406
1407
		// Tests for enctype support on a form(#6743)
1408
		enctype: !!document.createElement("form").enctype,
1409
1410
		// Makes sure cloning an html5 element does not cause problems
1411
		// Where outerHTML is undefined, this still works
1412
		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
1413
1414
		// Will be defined later
1415
		submitBubbles: true,
1416
		changeBubbles: true,
1417
		focusinBubbles: false,
1418
		deleteExpando: true,
1419
		noCloneEvent: true,
1420
		inlineBlockNeedsLayout: false,
1421
		shrinkWrapBlocks: false,
1422
		reliableMarginRight: true
1423
	};
1424
1425
	// Make sure checked status is properly cloned
1426
	input.checked = true;
1427
	support.noCloneChecked = input.cloneNode( true ).checked;
1428
1429
	// Make sure that the options inside disabled selects aren't marked as disabled
1430
	// (WebKit marks them as disabled)
1431
	select.disabled = true;
1432
	support.optDisabled = !opt.disabled;
1433
1434
	// Test to see if it's possible to delete an expando from an element
1435
	// Fails in Internet Explorer
1436
	try {
1437
		delete div.test;
1438
	} catch( e ) {
1439
		support.deleteExpando = false;
1440
	}
1441
1442
	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1443
		div.attachEvent( "onclick", function() {
1444
			// Cloning a node shouldn't copy over any
1445
			// bound event handlers (IE does this)
1446
			support.noCloneEvent = false;
1447
		});
1448
		div.cloneNode( true ).fireEvent( "onclick" );
1449
	}
1450
1451
	// Check if a radio maintains its value
1452
	// after being appended to the DOM
1453
	input = document.createElement("input");
1454
	input.value = "t";
1455
	input.setAttribute("type", "radio");
1456
	support.radioValue = input.value === "t";
1457
1458
	input.setAttribute("checked", "checked");
1459
	div.appendChild( input );
1460
	fragment = document.createDocumentFragment();
1461
	fragment.appendChild( div.lastChild );
1462
1463
	// WebKit doesn't clone checked state correctly in fragments
1464
	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1465
1466
	// Check if a disconnected checkbox will retain its checked
1467
	// value of true after appended to the DOM (IE6/7)
1468
	support.appendChecked = input.checked;
1469
1470
	fragment.removeChild( input );
1471
	fragment.appendChild( div );
1472
1473
	div.innerHTML = "";
1474
1475
	// Check if div with explicit width and no margin-right incorrectly
1476
	// gets computed margin-right based on width of container. For more
1477
	// info see bug #3333
1478
	// Fails in WebKit before Feb 2011 nightlies
1479
	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1480
	if ( window.getComputedStyle ) {
1481
		marginDiv = document.createElement( "div" );
1482
		marginDiv.style.width = "0";
1483
		marginDiv.style.marginRight = "0";
1484
		div.style.width = "2px";
1485
		div.appendChild( marginDiv );
1486
		support.reliableMarginRight =
1487
			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1488
	}
1489
1490
	// Technique from Juriy Zaytsev
1491
	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
1492
	// We only care about the case where non-standard event systems
1493
	// are used, namely in IE. Short-circuiting here helps us to
1494
	// avoid an eval call (in setAttribute) which can cause CSP
1495
	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1496
	if ( div.attachEvent ) {
1497
		for( i in {
1498
			submit: 1,
1499
			change: 1,
1500
			focusin: 1
1501
		}) {
1502
			eventName = "on" + i;
1503
			isSupported = ( eventName in div );
1504
			if ( !isSupported ) {
1505
				div.setAttribute( eventName, "return;" );
1506
				isSupported = ( typeof div[ eventName ] === "function" );
1507
			}
1508
			support[ i + "Bubbles" ] = isSupported;
1509
		}
1510
	}
1511
1512
	fragment.removeChild( div );
1513
1514
	// Null elements to avoid leaks in IE
1515
	fragment = select = opt = marginDiv = div = input = null;
1516
1517
	// Run tests that need a body at doc ready
1518
	jQuery(function() {
1519
		var container, outer, inner, table, td, offsetSupport,
1520
			conMarginTop, ptlm, vb, style, html,
1521
			body = document.getElementsByTagName("body")[0];
1522
1523
		if ( !body ) {
1524
			// Return for frameset docs that don't have a body
1525
			return;
1526
		}
1527
1528
		conMarginTop = 1;
1529
		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
1530
		vb = "visibility:hidden;border:0;";
1531
		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
1532
		html = "<div " + style + "><div></div></div>" +
1533
			"<table " + style + " cellpadding='0' cellspacing='0'>" +
1534
			"<tr><td></td></tr></table>";
1535
1536
		container = document.createElement("div");
1537
		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
1538
		body.insertBefore( container, body.firstChild );
1539
1540
		// Construct the test element
1541
		div = document.createElement("div");
1542
		container.appendChild( div );
1543
1544
		// Check if table cells still have offsetWidth/Height when they are set
1545
		// to display:none and there are still other visible table cells in a
1546
		// table row; if so, offsetWidth/Height are not reliable for use when
1547
		// determining if an element has been hidden directly using
1548
		// display:none (it is still safe to use offsets if a parent element is
1549
		// hidden; don safety goggles and see bug #4512 for more information).
1550
		// (only IE 8 fails this test)
1551
		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1552
		tds = div.getElementsByTagName( "td" );
1553
		isSupported = ( tds[ 0 ].offsetHeight === 0 );
1554
1555
		tds[ 0 ].style.display = "";
1556
		tds[ 1 ].style.display = "none";
1557
1558
		// Check if empty table cells still have offsetWidth/Height
1559
		// (IE <= 8 fail this test)
1560
		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1561
1562
		// Figure out if the W3C box model works as expected
1563
		div.innerHTML = "";
1564
		div.style.width = div.style.paddingLeft = "1px";
1565
		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
1566
1567
		if ( typeof div.style.zoom !== "undefined" ) {
1568
			// Check if natively block-level elements act like inline-block
1569
			// elements when setting their display to 'inline' and giving
1570
			// them layout
1571
			// (IE < 8 does this)
1572
			div.style.display = "inline";
1573
			div.style.zoom = 1;
1574
			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1575
1576
			// Check if elements with layout shrink-wrap their children
1577
			// (IE 6 does this)
1578
			div.style.display = "";
1579
			div.innerHTML = "<div style='width:4px;'></div>";
1580
			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1581
		}
1582
1583
		div.style.cssText = ptlm + vb;
1584
		div.innerHTML = html;
1585
1586
		outer = div.firstChild;
1587
		inner = outer.firstChild;
1588
		td = outer.nextSibling.firstChild.firstChild;
1589
1590
		offsetSupport = {
1591
			doesNotAddBorder: ( inner.offsetTop !== 5 ),
1592
			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
1593
		};
1594
1595
		inner.style.position = "fixed";
1596
		inner.style.top = "20px";
1597
1598
		// safari subtracts parent border width here which is 5px
1599
		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
1600
		inner.style.position = inner.style.top = "";
1601
1602
		outer.style.overflow = "hidden";
1603
		outer.style.position = "relative";
1604
1605
		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
1606
		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
1607
1608
		body.removeChild( container );
1609
		div  = container = null;
1610
1611
		jQuery.extend( support, offsetSupport );
1612
	});
1613
1614
	return support;
1615
})();
1616
1617
1618
1619
1620
var rbrace = /^(?:\{.*\}|\[.*\])$/,
1621
	rmultiDash = /([A-Z])/g;
1622
1623
jQuery.extend({
1624
	cache: {},
1625
1626
	// Please use with caution
1627
	uuid: 0,
1628
1629
	// Unique for each copy of jQuery on the page
1630
	// Non-digits removed to match rinlinejQuery
1631
	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1632
1633
	// The following elements throw uncatchable exceptions if you
1634
	// attempt to add expando properties to them.
1635
	noData: {
1636
		"embed": true,
1637
		// Ban all objects except for Flash (which handle expandos)
1638
		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1639
		"applet": true
1640
	},
1641
1642
	hasData: function( elem ) {
1643
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1644
		return !!elem && !isEmptyDataObject( elem );
1645
	},
1646
1647
	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1648
		if ( !jQuery.acceptData( elem ) ) {
1649
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1650
		}
1651
1652
		var privateCache, thisCache, ret,
1653
			internalKey = jQuery.expando,
1654
			getByName = typeof name === "string",
1655
1656
			// We have to handle DOM nodes and JS objects differently because IE6-7
1657
			// can't GC object references properly across the DOM-JS boundary
1658
			isNode = elem.nodeType,
1659
1660
			// Only DOM nodes need the global jQuery cache; JS object data is
1661
			// attached directly to the object so GC can occur automatically
1662
			cache = isNode ? jQuery.cache : elem,
1663
1664
			// Only defining an ID for JS objects if its cache already exists allows
1665
			// the code to shortcut on the same path as a DOM node with no cache
1666
			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
1667
			isEvents = name === "events";
1668
1669
		// Avoid doing any more work than we need to when trying to get data on an
1670
		// object that has no data at all
1671
		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
1672
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1673
		}
1674
1675
		if ( !id ) {
1676
			// Only DOM nodes need a new unique ID for each element since their data
1677
			// ends up in the global cache
1678
			if ( isNode ) {
1679
				elem[ internalKey ] = id = ++jQuery.uuid;
1680
			} else {
1681
				id = internalKey;
1682
			}
1683
		}
1684
1685
		if ( !cache[ id ] ) {
1686
			cache[ id ] = {};
1687
1688
			// Avoids exposing jQuery metadata on plain JS objects when the object
1689
			// is serialized using JSON.stringify
1690
			if ( !isNode ) {
1691
				cache[ id ].toJSON = jQuery.noop;
1692
			}
1693
		}
1694
1695
		// An object can be passed to jQuery.data instead of a key/value pair; this gets
1696
		// shallow copied over onto the existing cache
1697
		if ( typeof name === "object" || typeof name === "function" ) {
1698
			if ( pvt ) {
1699
				cache[ id ] = jQuery.extend( cache[ id ], name );
1700
			} else {
1701
				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
1702
			}
1703
		}
1704
1705
		privateCache = thisCache = cache[ id ];
1706
1707
		// jQuery data() is stored in a separate object inside the object's internal data
1708
		// cache in order to avoid key collisions between internal data and user-defined
1709
		// data.
1710
		if ( !pvt ) {
1711
			if ( !thisCache.data ) {
1712
				thisCache.data = {};
1713
			}
1714
1715
			thisCache = thisCache.data;
1716
		}
1717
1718
		if ( data !== undefined ) {
1719
			thisCache[ jQuery.camelCase( name ) ] = data;
1720
		}
1721
1722
		// Users should not attempt to inspect the internal events object using jQuery.data,
1723
		// it is undocumented and subject to change. But does anyone listen? No.
1724
		if ( isEvents && !thisCache[ name ] ) {
1725
			return privateCache.events;
1726
		}
1727
1728
		// Check for both converted-to-camel and non-converted data property names
1729
		// If a data property was specified
1730
		if ( getByName ) {
1731
1732
			// First Try to find as-is property data
1733
			ret = thisCache[ name ];
1734
1735
			// Test for null|undefined property data
1736
			if ( ret == null ) {
1737
1738
				// Try to find the camelCased property
1739
				ret = thisCache[ jQuery.camelCase( name ) ];
1740
			}
1741
		} else {
1742
			ret = thisCache;
1743
		}
1744
1745
		return ret;
1746
	},
1747
1748
	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1749
		if ( !jQuery.acceptData( elem ) ) {
1750
			return;
1751
		}
1752
1753
		var thisCache, i, l,
1754
1755
			// Reference to internal data cache key
1756
			internalKey = jQuery.expando,
1757
1758
			isNode = elem.nodeType,
1759
1760
			// See jQuery.data for more information
1761
			cache = isNode ? jQuery.cache : elem,
1762
1763
			// See jQuery.data for more information
1764
			id = isNode ? elem[ internalKey ] : internalKey;
1765
1766
		// If there is already no cache entry for this object, there is no
1767
		// purpose in continuing
1768
		if ( !cache[ id ] ) {
1769
			return;
1770
		}
1771
1772
		if ( name ) {
1773
1774
			thisCache = pvt ? cache[ id ] : cache[ id ].data;
1775
1776
			if ( thisCache ) {
1777
1778
				// Support array or space separated string names for data keys
1779
				if ( !jQuery.isArray( name ) ) {
1780
1781
					// try the string as a key before any manipulation
1782
					if ( name in thisCache ) {
1783
						name = [ name ];
1784
					} else {
1785
1786
						// split the camel cased version by spaces unless a key with the spaces exists
1787
						name = jQuery.camelCase( name );
1788
						if ( name in thisCache ) {
1789
							name = [ name ];
1790
						} else {
1791
							name = name.split( " " );
1792
						}
1793
					}
1794
				}
1795
1796
				for ( i = 0, l = name.length; i < l; i++ ) {
1797
					delete thisCache[ name[i] ];
1798
				}
1799
1800
				// If there is no data left in the cache, we want to continue
1801
				// and let the cache object itself get destroyed
1802
				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
1803
					return;
1804
				}
1805
			}
1806
		}
1807
1808
		// See jQuery.data for more information
1809
		if ( !pvt ) {
1810
			delete cache[ id ].data;
1811
1812
			// Don't destroy the parent cache unless the internal data object
1813
			// had been the only thing left in it
1814
			if ( !isEmptyDataObject(cache[ id ]) ) {
1815
				return;
1816
			}
1817
		}
1818
1819
		// Browsers that fail expando deletion also refuse to delete expandos on
1820
		// the window, but it will allow it on all other JS objects; other browsers
1821
		// don't care
1822
		// Ensure that `cache` is not a window object #10080
1823
		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
1824
			delete cache[ id ];
1825
		} else {
1826
			cache[ id ] = null;
1827
		}
1828
1829
		// We destroyed the cache and need to eliminate the expando on the node to avoid
1830
		// false lookups in the cache for entries that no longer exist
1831
		if ( isNode ) {
1832
			// IE does not allow us to delete expando properties from nodes,
1833
			// nor does it have a removeAttribute function on Document nodes;
1834
			// we must handle all of these cases
1835
			if ( jQuery.support.deleteExpando ) {
1836
				delete elem[ internalKey ];
1837
			} else if ( elem.removeAttribute ) {
1838
				elem.removeAttribute( internalKey );
1839
			} else {
1840
				elem[ internalKey ] = null;
1841
			}
1842
		}
1843
	},
1844
1845
	// For internal use only.
1846
	_data: function( elem, name, data ) {
1847
		return jQuery.data( elem, name, data, true );
1848
	},
1849
1850
	// A method for determining if a DOM node can handle the data expando
1851
	acceptData: function( elem ) {
1852
		if ( elem.nodeName ) {
1853
			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1854
1855
			if ( match ) {
1856
				return !(match === true || elem.getAttribute("classid") !== match);
1857
			}
1858
		}
1859
1860
		return true;
1861
	}
1862
});
1863
1864
jQuery.fn.extend({
1865
	data: function( key, value ) {
1866
		var parts, attr, name,
1867
			data = null;
1868
1869
		if ( typeof key === "undefined" ) {
1870
			if ( this.length ) {
1871
				data = jQuery.data( this[0] );
1872
1873
				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
1874
					attr = this[0].attributes;
1875
					for ( var i = 0, l = attr.length; i < l; i++ ) {
1876
						name = attr[i].name;
1877
1878
						if ( name.indexOf( "data-" ) === 0 ) {
1879
							name = jQuery.camelCase( name.substring(5) );
1880
1881
							dataAttr( this[0], name, data[ name ] );
1882
						}
1883
					}
1884
					jQuery._data( this[0], "parsedAttrs", true );
1885
				}
1886
			}
1887
1888
			return data;
1889
1890
		} else if ( typeof key === "object" ) {
1891
			return this.each(function() {
1892
				jQuery.data( this, key );
1893
			});
1894
		}
1895
1896
		parts = key.split(".");
1897
		parts[1] = parts[1] ? "." + parts[1] : "";
1898
1899
		if ( value === undefined ) {
1900
			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1901
1902
			// Try to fetch any internally stored data first
1903
			if ( data === undefined && this.length ) {
1904
				data = jQuery.data( this[0], key );
1905
				data = dataAttr( this[0], key, data );
1906
			}
1907
1908
			return data === undefined && parts[1] ?
1909
				this.data( parts[0] ) :
1910
				data;
1911
1912
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1913
			return this.each(function() {
1914
				var self = jQuery( this ),
1915
					args = [ parts[0], value ];
1916
1917
				self.triggerHandler( "setData" + parts[1] + "!", args );
1918
				jQuery.data( this, key, value );
1919
				self.triggerHandler( "changeData" + parts[1] + "!", args );
1920
			});
1921
		}
1922
	},
1923
1924
	removeData: function( key ) {
1925
		return this.each(function() {
1926
			jQuery.removeData( this, key );
1927
		});
1928
	}
1929
});
1930
1931
function dataAttr( elem, key, data ) {
1932
	// If nothing was found internally, try to fetch any
1933
	// data from the HTML5 data-* attribute
1934
	if ( data === undefined && elem.nodeType === 1 ) {
1935
1936
		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
1937
1938
		data = elem.getAttribute( name );
1939
1940
		if ( typeof data === "string" ) {
1941
			try {
1942
				data = data === "true" ? true :
1943
				data === "false" ? false :
1944
				data === "null" ? null :
1945
				jQuery.isNumeric( data ) ? parseFloat( data ) :
1946
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
1947
					data;
1948
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1949
1950
			// Make sure we set the data so it isn't changed later
1951
			jQuery.data( elem, key, data );
1952
1953
		} else {
1954
			data = undefined;
1955
		}
1956
	}
1957
1958
	return data;
1959
}
1960
1961
// checks a cache object for emptiness
1962
function isEmptyDataObject( obj ) {
1963
	for ( var name in obj ) {
1964
1965
		// if the public data object is empty, the private is still empty
1966
		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
1967
			continue;
1968
		}
1969
		if ( name !== "toJSON" ) {
1970
			return false;
1971
		}
1972
	}
1973
1974
	return true;
1975
}
1976
1977
1978
1979
1980
function handleQueueMarkDefer( elem, type, src ) {
1981
	var deferDataKey = type + "defer",
1982
		queueDataKey = type + "queue",
1983
		markDataKey = type + "mark",
1984
		defer = jQuery._data( elem, deferDataKey );
1985
	if ( defer &&
1986
		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
1987
		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
1988
		// Give room for hard-coded callbacks to fire first
1989
		// and eventually mark/queue something else on the element
1990
		setTimeout( function() {
1991
			if ( !jQuery._data( elem, queueDataKey ) &&
1992
				!jQuery._data( elem, markDataKey ) ) {
1993
				jQuery.removeData( elem, deferDataKey, true );
1994
				defer.fire();
1995
			}
1996
		}, 0 );
1997
	}
1998
}
1999
2000
jQuery.extend({
2001
2002
	_mark: function( elem, type ) {
2003
		if ( elem ) {
2004
			type = ( type || "fx" ) + "mark";
2005
			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
2006
		}
2007
	},
2008
2009
	_unmark: function( force, elem, type ) {
2010
		if ( force !== true ) {
2011
			type = elem;
2012
			elem = force;
2013
			force = false;
2014
		}
2015
		if ( elem ) {
2016
			type = type || "fx";
2017
			var key = type + "mark",
2018
				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
2019
			if ( count ) {
2020
				jQuery._data( elem, key, count );
2021
			} else {
2022
				jQuery.removeData( elem, key, true );
2023
				handleQueueMarkDefer( elem, type, "mark" );
2024
			}
2025
		}
2026
	},
2027
2028
	queue: function( elem, type, data ) {
2029
		var q;
2030
		if ( elem ) {
2031
			type = ( type || "fx" ) + "queue";
2032
			q = jQuery._data( elem, type );
2033
2034
			// Speed up dequeue by getting out quickly if this is just a lookup
2035
			if ( data ) {
2036
				if ( !q || jQuery.isArray(data) ) {
2037
					q = jQuery._data( elem, type, jQuery.makeArray(data) );
2038
				} else {
2039
					q.push( data );
2040
				}
2041
			}
2042
			return q || [];
2043
		}
2044
	},
2045
2046
	dequeue: function( elem, type ) {
2047
		type = type || "fx";
2048
2049
		var queue = jQuery.queue( elem, type ),
2050
			fn = queue.shift(),
2051
			hooks = {};
2052
2053
		// If the fx queue is dequeued, always remove the progress sentinel
2054
		if ( fn === "inprogress" ) {
2055
			fn = queue.shift();
2056
		}
2057
2058
		if ( fn ) {
2059
			// Add a progress sentinel to prevent the fx queue from being
2060
			// automatically dequeued
2061
			if ( type === "fx" ) {
2062
				queue.unshift( "inprogress" );
2063
			}
2064
2065
			jQuery._data( elem, type + ".run", hooks );
2066
			fn.call( elem, function() {
2067
				jQuery.dequeue( elem, type );
2068
			}, hooks );
2069
		}
2070
2071
		if ( !queue.length ) {
2072
			jQuery.removeData( elem, type + "queue " + type + ".run", true );
2073
			handleQueueMarkDefer( elem, type, "queue" );
2074
		}
2075
	}
2076
});
2077
2078
jQuery.fn.extend({
2079 View Code Duplication
	queue: function( type, data ) {
2080
		if ( typeof type !== "string" ) {
2081
			data = type;
2082
			type = "fx";
2083
		}
2084
2085
		if ( data === undefined ) {
2086
			return jQuery.queue( this[0], type );
2087
		}
2088
		return this.each(function() {
2089
			var queue = jQuery.queue( this, type, data );
2090
2091
			if ( type === "fx" && queue[0] !== "inprogress" ) {
2092
				jQuery.dequeue( this, type );
2093
			}
2094
		});
2095
	},
2096
	dequeue: function( type ) {
2097
		return this.each(function() {
2098
			jQuery.dequeue( this, type );
2099
		});
2100
	},
2101
	// Based off of the plugin by Clint Helfers, with permission.
2102
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
2103
	delay: function( time, type ) {
2104
		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
2105
		type = type || "fx";
2106
2107
		return this.queue( type, function( next, hooks ) {
2108
			var timeout = setTimeout( next, time );
2109
			hooks.stop = function() {
2110
				clearTimeout( timeout );
2111
			};
2112
		});
2113
	},
2114
	clearQueue: function( type ) {
2115
		return this.queue( type || "fx", [] );
2116
	},
2117
	// Get a promise resolved when queues of a certain type
2118
	// are emptied (fx is the type by default)
2119
	promise: function( type, object ) {
2120
		if ( typeof type !== "string" ) {
2121
			object = type;
2122
			type = undefined;
2123
		}
2124
		type = type || "fx";
2125
		var defer = jQuery.Deferred(),
2126
			elements = this,
2127
			i = elements.length,
2128
			count = 1,
2129
			deferDataKey = type + "defer",
2130
			queueDataKey = type + "queue",
2131
			markDataKey = type + "mark",
2132
			tmp;
2133
		function resolve() {
2134
			if ( !( --count ) ) {
2135
				defer.resolveWith( elements, [ elements ] );
2136
			}
2137
		}
2138
		while( i-- ) {
2139
			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2140
					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2141
						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2142
					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
2143
				count++;
2144
				tmp.add( resolve );
2145
			}
2146
		}
2147
		resolve();
2148
		return defer.promise();
2149
	}
2150
});
2151
2152
2153
2154
2155
var rclass = /[\n\t\r]/g,
2156
	rspace = /\s+/,
2157
	rreturn = /\r/g,
2158
	rtype = /^(?:button|input)$/i,
2159
	rfocusable = /^(?:button|input|object|select|textarea)$/i,
2160
	rclickable = /^a(?:rea)?$/i,
2161
	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
2162
	getSetAttribute = jQuery.support.getSetAttribute,
2163
	nodeHook, boolHook, fixSpecified;
2164
2165
jQuery.fn.extend({
2166
	attr: function( name, value ) {
2167
		return jQuery.access( this, name, value, true, jQuery.attr );
2168
	},
2169
2170
	removeAttr: function( name ) {
2171
		return this.each(function() {
2172
			jQuery.removeAttr( this, name );
2173
		});
2174
	},
2175
2176
	prop: function( name, value ) {
2177
		return jQuery.access( this, name, value, true, jQuery.prop );
2178
	},
2179
2180
	removeProp: function( name ) {
2181
		name = jQuery.propFix[ name ] || name;
2182
		return this.each(function() {
2183
			// try/catch handles cases where IE balks (such as removing a property on window)
2184
			try {
2185
				this[ name ] = undefined;
2186
				delete this[ name ];
2187
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
2188
		});
2189
	},
2190
2191 View Code Duplication
	addClass: function( value ) {
2192
		var classNames, i, l, elem,
2193
			setClass, c, cl;
2194
2195
		if ( jQuery.isFunction( value ) ) {
2196
			return this.each(function( j ) {
2197
				jQuery( this ).addClass( value.call(this, j, this.className) );
2198
			});
2199
		}
2200
2201
		if ( value && typeof value === "string" ) {
2202
			classNames = value.split( rspace );
2203
2204
			for ( i = 0, l = this.length; i < l; i++ ) {
2205
				elem = this[ i ];
2206
2207
				if ( elem.nodeType === 1 ) {
2208
					if ( !elem.className && classNames.length === 1 ) {
2209
						elem.className = value;
2210
2211
					} else {
2212
						setClass = " " + elem.className + " ";
2213
2214
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2215
							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
2216
								setClass += classNames[ c ] + " ";
2217
							}
2218
						}
2219
						elem.className = jQuery.trim( setClass );
2220
					}
2221
				}
2222
			}
2223
		}
2224
2225
		return this;
2226
	},
2227
2228 View Code Duplication
	removeClass: function( value ) {
2229
		var classNames, i, l, elem, className, c, cl;
2230
2231
		if ( jQuery.isFunction( value ) ) {
2232
			return this.each(function( j ) {
2233
				jQuery( this ).removeClass( value.call(this, j, this.className) );
2234
			});
2235
		}
2236
2237
		if ( (value && typeof value === "string") || value === undefined ) {
2238
			classNames = ( value || "" ).split( rspace );
2239
2240
			for ( i = 0, l = this.length; i < l; i++ ) {
2241
				elem = this[ i ];
2242
2243
				if ( elem.nodeType === 1 && elem.className ) {
2244
					if ( value ) {
2245
						className = (" " + elem.className + " ").replace( rclass, " " );
2246
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
2247
							className = className.replace(" " + classNames[ c ] + " ", " ");
2248
						}
2249
						elem.className = jQuery.trim( className );
2250
2251
					} else {
2252
						elem.className = "";
2253
					}
2254
				}
2255
			}
2256
		}
2257
2258
		return this;
2259
	},
2260
2261 View Code Duplication
	toggleClass: function( value, stateVal ) {
2262
		var type = typeof value,
2263
			isBool = typeof stateVal === "boolean";
2264
2265
		if ( jQuery.isFunction( value ) ) {
2266
			return this.each(function( i ) {
2267
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2268
			});
2269
		}
2270
2271
		return this.each(function() {
2272
			if ( type === "string" ) {
2273
				// toggle individual class names
2274
				var className,
2275
					i = 0,
2276
					self = jQuery( this ),
2277
					state = stateVal,
2278
					classNames = value.split( rspace );
2279
2280
				while ( (className = classNames[ i++ ]) ) {
2281
					// check each className given, space seperated list
2282
					state = isBool ? state : !self.hasClass( className );
2283
					self[ state ? "addClass" : "removeClass" ]( className );
2284
				}
2285
2286
			} else if ( type === "undefined" || type === "boolean" ) {
2287
				if ( this.className ) {
2288
					// store className if set
2289
					jQuery._data( this, "__className__", this.className );
2290
				}
2291
2292
				// toggle whole className
2293
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2294
			}
2295
		});
2296
	},
2297
2298
	hasClass: function( selector ) {
2299
		var className = " " + selector + " ",
2300
			i = 0,
2301
			l = this.length;
2302
		for ( ; i < l; i++ ) {
2303
			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2304
				return true;
2305
			}
2306
		}
2307
2308
		return false;
2309
	},
2310
2311
	val: function( value ) {
2312
		var hooks, ret, isFunction,
2313
			elem = this[0];
2314
2315
		if ( !arguments.length ) {
2316
			if ( elem ) {
2317
				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2318
2319
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2320
					return ret;
2321
				}
2322
2323
				ret = elem.value;
2324
2325
				return typeof ret === "string" ?
2326
					// handle most common string cases
2327
					ret.replace(rreturn, "") :
2328
					// handle cases where value is null/undef or number
2329
					ret == null ? "" : ret;
2330
			}
2331
2332
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2333
		}
2334
2335
		isFunction = jQuery.isFunction( value );
2336
2337
		return this.each(function( i ) {
2338
			var self = jQuery(this), val;
2339
2340
			if ( this.nodeType !== 1 ) {
2341
				return;
2342
			}
2343
2344
			if ( isFunction ) {
2345
				val = value.call( this, i, self.val() );
2346
			} else {
2347
				val = value;
2348
			}
2349
2350
			// Treat null/undefined as ""; convert numbers to string
2351
			if ( val == null ) {
2352
				val = "";
2353
			} else if ( typeof val === "number" ) {
2354
				val += "";
2355
			} else if ( jQuery.isArray( val ) ) {
2356
				val = jQuery.map(val, function ( value ) {
2357
					return value == null ? "" : value + "";
2358
				});
2359
			}
2360
2361
			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2362
2363
			// If set returns undefined, fall back to normal setting
2364
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2365
				this.value = val;
2366
			}
2367
		});
2368
	}
2369
});
2370
2371
jQuery.extend({
2372
	valHooks: {
2373
		option: {
2374
			get: function( elem ) {
2375
				// attributes.value is undefined in Blackberry 4.7 but
2376
				// uses .value. See #6932
2377
				var val = elem.attributes.value;
2378
				return !val || val.specified ? elem.value : elem.text;
2379
			}
2380
		},
2381
		select: {
2382
			get: function( elem ) {
2383
				var value, i, max, option,
2384
					index = elem.selectedIndex,
2385
					values = [],
2386
					options = elem.options,
2387
					one = elem.type === "select-one";
2388
2389
				// Nothing was selected
2390
				if ( index < 0 ) {
2391
					return null;
2392
				}
2393
2394
				// Loop through all the selected options
2395
				i = one ? index : 0;
2396
				max = one ? index + 1 : options.length;
2397 View Code Duplication
				for ( ; i < max; i++ ) {
2398
					option = options[ i ];
2399
2400
					// Don't return options that are disabled or in a disabled optgroup
2401
					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2402
							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2403
2404
						// Get the specific value for the option
2405
						value = jQuery( option ).val();
2406
2407
						// We don't need an array for one selects
2408
						if ( one ) {
2409
							return value;
2410
						}
2411
2412
						// Multi-Selects return an array
2413
						values.push( value );
2414
					}
2415
				}
2416
2417
				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2418
				if ( one && !values.length && options.length ) {
2419
					return jQuery( options[ index ] ).val();
2420
				}
2421
2422
				return values;
2423
			},
2424
2425
			set: function( elem, value ) {
2426
				var values = jQuery.makeArray( value );
2427
2428
				jQuery(elem).find("option").each(function() {
2429
					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2430
				});
2431
2432
				if ( !values.length ) {
2433
					elem.selectedIndex = -1;
2434
				}
2435
				return values;
2436
			}
2437
		}
2438
	},
2439
2440
	attrFn: {
2441
		val: true,
2442
		css: true,
2443
		html: true,
2444
		text: true,
2445
		data: true,
2446
		width: true,
2447
		height: true,
2448
		offset: true
2449
	},
2450
2451
	attr: function( elem, name, value, pass ) {
2452
		var ret, hooks, notxml,
2453
			nType = elem.nodeType;
2454
2455
		// don't get/set attributes on text, comment and attribute nodes
2456
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2457
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2458
		}
2459
2460
		if ( pass && name in jQuery.attrFn ) {
2461
			return jQuery( elem )[ name ]( value );
2462
		}
2463
2464
		// Fallback to prop when attributes are not supported
2465
		if ( typeof elem.getAttribute === "undefined" ) {
2466
			return jQuery.prop( elem, name, value );
2467
		}
2468
2469
		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2470
2471
		// All attributes are lowercase
2472
		// Grab necessary hook if one is defined
2473
		if ( notxml ) {
2474
			name = name.toLowerCase();
2475
			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
2476
		}
2477
2478
		if ( value !== undefined ) {
2479
2480
			if ( value === null ) {
2481
				jQuery.removeAttr( elem, name );
2482
				return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2483
2484
			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2485
				return ret;
2486
2487
			} else {
2488
				elem.setAttribute( name, "" + value );
2489
				return value;
2490
			}
2491
2492
		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2493
			return ret;
2494
2495
		} else {
2496
2497
			ret = elem.getAttribute( name );
2498
2499
			// Non-existent attributes return null, we normalize to undefined
2500
			return ret === null ?
2501
				undefined :
2502
				ret;
2503
		}
2504
	},
2505
2506
	removeAttr: function( elem, value ) {
2507
		var propName, attrNames, name, l,
2508
			i = 0;
2509
2510
		if ( value && elem.nodeType === 1 ) {
2511
			attrNames = value.toLowerCase().split( rspace );
2512
			l = attrNames.length;
2513
2514
			for ( ; i < l; i++ ) {
2515
				name = attrNames[ i ];
2516
2517
				if ( name ) {
2518
					propName = jQuery.propFix[ name ] || name;
2519
2520
					// See #9699 for explanation of this approach (setting first, then removal)
2521
					jQuery.attr( elem, name, "" );
2522
					elem.removeAttribute( getSetAttribute ? name : propName );
2523
2524
					// Set corresponding property to false for boolean attributes
2525
					if ( rboolean.test( name ) && propName in elem ) {
2526
						elem[ propName ] = false;
2527
					}
2528
				}
2529
			}
2530
		}
2531
	},
2532
2533
	attrHooks: {
2534
		type: {
2535
			set: function( elem, value ) {
2536
				// We can't allow the type property to be changed (since it causes problems in IE)
2537
				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2538
					jQuery.error( "type property can't be changed" );
2539
				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2540
					// Setting the type on a radio button after the value resets the value in IE6-9
2541
					// Reset value to it's default in case type is set after value
2542
					// This is for element creation
2543
					var val = elem.value;
2544
					elem.setAttribute( "type", value );
2545
					if ( val ) {
2546
						elem.value = val;
2547
					}
2548
					return value;
2549
				}
2550
			}
2551
		},
2552
		// Use the value property for back compat
2553
		// Use the nodeHook for button elements in IE6/7 (#1954)
2554
		value: {
2555
			get: function( elem, name ) {
2556
				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2557
					return nodeHook.get( elem, name );
2558
				}
2559
				return name in elem ?
2560
					elem.value :
2561
					null;
2562
			},
2563
			set: function( elem, value, name ) {
2564
				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
2565
					return nodeHook.set( elem, value, name );
2566
				}
2567
				// Does not return so that setAttribute is also used
2568
				elem.value = value;
2569
			}
2570
		}
2571
	},
2572
2573
	propFix: {
2574
		tabindex: "tabIndex",
2575
		readonly: "readOnly",
2576
		"for": "htmlFor",
2577
		"class": "className",
2578
		maxlength: "maxLength",
2579
		cellspacing: "cellSpacing",
2580
		cellpadding: "cellPadding",
2581
		rowspan: "rowSpan",
2582
		colspan: "colSpan",
2583
		usemap: "useMap",
2584
		frameborder: "frameBorder",
2585
		contenteditable: "contentEditable"
2586
	},
2587
2588
	prop: function( elem, name, value ) {
2589
		var ret, hooks, notxml,
2590
			nType = elem.nodeType;
2591
2592
		// don't get/set properties on text, comment and attribute nodes
2593
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2594
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2595
		}
2596
2597
		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2598
2599
		if ( notxml ) {
2600
			// Fix name and attach hooks
2601
			name = jQuery.propFix[ name ] || name;
2602
			hooks = jQuery.propHooks[ name ];
2603
		}
2604
2605
		if ( value !== undefined ) {
2606
			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2607
				return ret;
2608
2609
			} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2610
				return ( elem[ name ] = value );
2611
			}
2612
2613
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2614
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
2615
				return ret;
2616
2617
			} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2618
				return elem[ name ];
2619
			}
2620
		}
2621
	},
2622
2623
	propHooks: {
2624
		tabIndex: {
2625
			get: function( elem ) {
2626
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2627
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2628
				var attributeNode = elem.getAttributeNode("tabindex");
2629
2630
				return attributeNode && attributeNode.specified ?
2631
					parseInt( attributeNode.value, 10 ) :
2632
					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2633
						0 :
2634
						undefined;
2635
			}
2636
		}
2637
	}
2638
});
2639
2640
// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
2641
jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
2642
2643
// Hook for boolean attributes
2644
boolHook = {
2645
	get: function( elem, name ) {
2646
		// Align boolean attributes with corresponding properties
2647
		// Fall back to attribute presence where some booleans are not supported
2648
		var attrNode,
2649
			property = jQuery.prop( elem, name );
2650
		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
2651
			name.toLowerCase() :
2652
			undefined;
2653
	},
2654
	set: function( elem, value, name ) {
2655
		var propName;
2656
		if ( value === false ) {
2657
			// Remove boolean attributes when set to false
2658
			jQuery.removeAttr( elem, name );
2659
		} else {
2660
			// value is true since we know at this point it's type boolean and not false
2661
			// Set boolean attributes to the same name and set the DOM property
2662
			propName = jQuery.propFix[ name ] || name;
2663
			if ( propName in elem ) {
2664
				// Only set the IDL specifically if it already exists on the element
2665
				elem[ propName ] = true;
2666
			}
2667
2668
			elem.setAttribute( name, name.toLowerCase() );
2669
		}
2670
		return name;
2671
	}
2672
};
2673
2674
// IE6/7 do not support getting/setting some attributes with get/setAttribute
2675
if ( !getSetAttribute ) {
2676
2677
	fixSpecified = {
2678
		name: true,
2679
		id: true
2680
	};
2681
2682
	// Use this for any attribute in IE6/7
2683
	// This fixes almost every IE6/7 issue
2684
	nodeHook = jQuery.valHooks.button = {
2685
		get: function( elem, name ) {
2686
			var ret;
2687
			ret = elem.getAttributeNode( name );
2688
			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
2689
				ret.nodeValue :
2690
				undefined;
2691
		},
2692
		set: function( elem, value, name ) {
2693
			// Set the existing or create a new attribute node
2694
			var ret = elem.getAttributeNode( name );
2695
			if ( !ret ) {
2696
				ret = document.createAttribute( name );
2697
				elem.setAttributeNode( ret );
2698
			}
2699
			return ( ret.nodeValue = value + "" );
2700
		}
2701
	};
2702
2703
	// Apply the nodeHook to tabindex
2704
	jQuery.attrHooks.tabindex.set = nodeHook.set;
2705
2706
	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
2707
	// This is for removals
2708
	jQuery.each([ "width", "height" ], function( i, name ) {
2709
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2710
			set: function( elem, value ) {
2711
				if ( value === "" ) {
2712
					elem.setAttribute( name, "auto" );
2713
					return value;
2714
				}
2715
			}
2716
		});
2717
	});
2718
2719
	// Set contenteditable to false on removals(#10429)
2720
	// Setting to empty string throws an error as an invalid value
2721
	jQuery.attrHooks.contenteditable = {
2722
		get: nodeHook.get,
2723
		set: function( elem, value, name ) {
2724
			if ( value === "" ) {
2725
				value = "false";
2726
			}
2727
			nodeHook.set( elem, value, name );
2728
		}
2729
	};
2730
}
2731
2732
2733
// Some attributes require a special call on IE
2734
if ( !jQuery.support.hrefNormalized ) {
2735
	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2736
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2737
			get: function( elem ) {
2738
				var ret = elem.getAttribute( name, 2 );
2739
				return ret === null ? undefined : ret;
2740
			}
2741
		});
2742
	});
2743
}
2744
2745
if ( !jQuery.support.style ) {
2746
	jQuery.attrHooks.style = {
2747
		get: function( elem ) {
2748
			// Return undefined in the case of empty string
2749
			// Normalize to lowercase since IE uppercases css property names
2750
			return elem.style.cssText.toLowerCase() || undefined;
2751
		},
2752
		set: function( elem, value ) {
2753
			return ( elem.style.cssText = "" + value );
2754
		}
2755
	};
2756
}
2757
2758
// Safari mis-reports the default selected property of an option
2759
// Accessing the parent's selectedIndex property fixes it
2760
if ( !jQuery.support.optSelected ) {
2761
	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2762
		get: function( elem ) {
2763
			var parent = elem.parentNode;
2764
2765
			if ( parent ) {
2766
				parent.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.selectedIndex is not used.
Loading history...
2767
2768
				// Make sure that it also works with optgroups, see #5701
2769
				if ( parent.parentNode ) {
2770
					parent.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.parentNode.selectedIndex is not used.
Loading history...
2771
				}
2772
			}
2773
			return null;
2774
		}
2775
	});
2776
}
2777
2778
// IE6/7 call enctype encoding
2779
if ( !jQuery.support.enctype ) {
2780
	jQuery.propFix.enctype = "encoding";
2781
}
2782
2783
// Radios and checkboxes getter/setter
2784
if ( !jQuery.support.checkOn ) {
2785
	jQuery.each([ "radio", "checkbox" ], function() {
2786
		jQuery.valHooks[ this ] = {
2787
			get: function( elem ) {
2788
				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2789
				return elem.getAttribute("value") === null ? "on" : elem.value;
2790
			}
2791
		};
2792
	});
2793
}
2794
jQuery.each([ "radio", "checkbox" ], function() {
2795
	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2796
		set: function( elem, value ) {
2797
			if ( jQuery.isArray( value ) ) {
2798
				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
2799
			}
2800
		}
2801
	});
2802
});
2803
2804
2805
2806
2807
var rformElems = /^(?:textarea|input|select)$/i,
2808
	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
2809
	rhoverHack = /\bhover(\.\S+)?\b/,
2810
	rkeyEvent = /^key/,
2811
	rmouseEvent = /^(?:mouse|contextmenu)|click/,
2812
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
2813
	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
2814
	quickParse = function( selector ) {
2815
		var quick = rquickIs.exec( selector );
2816
		if ( quick ) {
2817
			//   0  1    2   3
2818
			// [ _, tag, id, class ]
2819
			quick[1] = ( quick[1] || "" ).toLowerCase();
2820
			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
2821
		}
2822
		return quick;
2823
	},
2824
	quickIs = function( elem, m ) {
2825
		var attrs = elem.attributes || {};
2826
		return (
2827
			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
2828
			(!m[2] || (attrs.id || {}).value === m[2]) &&
2829
			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
2830
		);
2831
	},
2832
	hoverHack = function( events ) {
2833
		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
2834
	};
2835
2836
/*
2837
 * Helper functions for managing events -- not part of the public interface.
2838
 * Props to Dean Edwards' addEvent library for many of the ideas.
2839
 */
2840
jQuery.event = {
2841
2842
	add: function( elem, types, handler, data, selector ) {
2843
2844
		var elemData, eventHandle, events,
2845
			t, tns, type, namespaces, handleObj,
2846
			handleObjIn, quick, handlers, special;
2847
2848
		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
2849
		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
2850
			return;
2851
		}
2852
2853
		// Caller can pass in an object of custom data in lieu of the handler
2854
		if ( handler.handler ) {
2855
			handleObjIn = handler;
2856
			handler = handleObjIn.handler;
2857
		}
2858
2859
		// Make sure that the handler has a unique ID, used to find/remove it later
2860
		if ( !handler.guid ) {
2861
			handler.guid = jQuery.guid++;
2862
		}
2863
2864
		// Init the element's event structure and main handler, if this is the first
2865
		events = elemData.events;
2866
		if ( !events ) {
2867
			elemData.events = events = {};
2868
		}
2869
		eventHandle = elemData.handle;
2870
		if ( !eventHandle ) {
2871
			elemData.handle = eventHandle = function( e ) {
2872
				// Discard the second event of a jQuery.event.trigger() and
2873
				// when an event is called after a page has unloaded
2874
				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2875
					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
2876
					undefined;
2877
			};
2878
			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
2879
			eventHandle.elem = elem;
2880
		}
2881
2882
		// Handle multiple events separated by a space
2883
		// jQuery(...).bind("mouseover mouseout", fn);
2884
		types = jQuery.trim( hoverHack(types) ).split( " " );
2885
		for ( t = 0; t < types.length; t++ ) {
2886
2887
			tns = rtypenamespace.exec( types[t] ) || [];
2888
			type = tns[1];
2889
			namespaces = ( tns[2] || "" ).split( "." ).sort();
2890
2891
			// If event changes its type, use the special event handlers for the changed type
2892
			special = jQuery.event.special[ type ] || {};
2893
2894
			// If selector defined, determine special event api type, otherwise given type
2895
			type = ( selector ? special.delegateType : special.bindType ) || type;
2896
2897
			// Update special based on newly reset type
2898
			special = jQuery.event.special[ type ] || {};
2899
2900
			// handleObj is passed to all event handlers
2901
			handleObj = jQuery.extend({
2902
				type: type,
2903
				origType: tns[1],
2904
				data: data,
2905
				handler: handler,
2906
				guid: handler.guid,
2907
				selector: selector,
2908
				quick: quickParse( selector ),
2909
				namespace: namespaces.join(".")
2910
			}, handleObjIn );
0 ignored issues
show
Bug introduced by
The variable handleObjIn does not seem to be initialized in case handler.handler on line 2854 is false. Are you sure the function extend handles undefined variables?
Loading history...
2911
2912
			// Init the event handler queue if we're the first
2913
			handlers = events[ type ];
2914
			if ( !handlers ) {
2915
				handlers = events[ type ] = [];
2916
				handlers.delegateCount = 0;
2917
2918
				// Only use addEventListener/attachEvent if the special events handler returns false
2919
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2920
					// Bind the global event handler to the element
2921
					if ( elem.addEventListener ) {
2922
						elem.addEventListener( type, eventHandle, false );
2923
2924
					} else if ( elem.attachEvent ) {
2925
						elem.attachEvent( "on" + type, eventHandle );
2926
					}
2927
				}
2928
			}
2929
2930
			if ( special.add ) {
2931
				special.add.call( elem, handleObj );
2932
2933
				if ( !handleObj.handler.guid ) {
2934
					handleObj.handler.guid = handler.guid;
2935
				}
2936
			}
2937
2938
			// Add to the element's handler list, delegates in front
2939
			if ( selector ) {
2940
				handlers.splice( handlers.delegateCount++, 0, handleObj );
2941
			} else {
2942
				handlers.push( handleObj );
2943
			}
2944
2945
			// Keep track of which events have ever been used, for event optimization
2946
			jQuery.event.global[ type ] = true;
2947
		}
2948
2949
		// Nullify elem to prevent memory leaks in IE
2950
		elem = null;
2951
	},
2952
2953
	global: {},
2954
2955
	// Detach an event or set of events from an element
2956
	remove: function( elem, types, handler, selector, mappedTypes ) {
2957
2958
		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2959
			t, tns, type, origType, namespaces, origCount,
2960
			j, events, special, handle, eventType, handleObj;
2961
2962
		if ( !elemData || !(events = elemData.events) ) {
2963
			return;
2964
		}
2965
2966
		// Once for each type.namespace in types; type may be omitted
2967
		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
2968
		for ( t = 0; t < types.length; t++ ) {
2969
			tns = rtypenamespace.exec( types[t] ) || [];
2970
			type = origType = tns[1];
2971
			namespaces = tns[2];
2972
2973
			// Unbind all events (on this namespace, if provided) for the element
2974
			if ( !type ) {
2975
				for ( type in events ) {
2976
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
2977
				}
2978
				continue;
2979
			}
2980
2981
			special = jQuery.event.special[ type ] || {};
2982
			type = ( selector? special.delegateType : special.bindType ) || type;
2983
			eventType = events[ type ] || [];
2984
			origCount = eventType.length;
2985
			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
2986
2987
			// Remove matching events
2988
			for ( j = 0; j < eventType.length; j++ ) {
2989
				handleObj = eventType[ j ];
2990
2991
				if ( ( mappedTypes || origType === handleObj.origType ) &&
2992
					 ( !handler || handler.guid === handleObj.guid ) &&
2993
					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
2994
					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
2995
					eventType.splice( j--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable j here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
2996
2997
					if ( handleObj.selector ) {
2998
						eventType.delegateCount--;
2999
					}
3000
					if ( special.remove ) {
3001
						special.remove.call( elem, handleObj );
3002
					}
3003
				}
3004
			}
3005
3006
			// Remove generic event handler if we removed something and no more handlers exist
3007
			// (avoids potential for endless recursion during removal of special event handlers)
3008
			if ( eventType.length === 0 && origCount !== eventType.length ) {
3009
				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
3010
					jQuery.removeEvent( elem, type, elemData.handle );
3011
				}
3012
3013
				delete events[ type ];
3014
			}
3015
		}
3016
3017
		// Remove the expando if it's no longer used
3018
		if ( jQuery.isEmptyObject( events ) ) {
3019
			handle = elemData.handle;
3020
			if ( handle ) {
3021
				handle.elem = null;
3022
			}
3023
3024
			// removeData also checks for emptiness and clears the expando if empty
3025
			// so use it instead of delete
3026
			jQuery.removeData( elem, [ "events", "handle" ], true );
3027
		}
3028
	},
3029
3030
	// Events that are safe to short-circuit if no handlers are attached.
3031
	// Native DOM events should not be added, they may have inline handlers.
3032
	customEvent: {
3033
		"getData": true,
3034
		"setData": true,
3035
		"changeData": true
3036
	},
3037
3038
	trigger: function( event, data, elem, onlyHandlers ) {
3039
		// Don't do events on text and comment nodes
3040
		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
3041
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3042
		}
3043
3044
		// Event object or event type
3045
		var type = event.type || event,
3046
			namespaces = [],
3047
			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
3048
3049
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
3050
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
3051
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3052
		}
3053
3054
		if ( type.indexOf( "!" ) >= 0 ) {
3055
			// Exclusive events trigger only for the exact event (no namespaces)
3056
			type = type.slice(0, -1);
3057
			exclusive = true;
3058
		}
3059
3060
		if ( type.indexOf( "." ) >= 0 ) {
3061
			// Namespaced trigger; create a regexp to match event type in handle()
3062
			namespaces = type.split(".");
3063
			type = namespaces.shift();
3064
			namespaces.sort();
3065
		}
3066
3067
		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3068
			// No jQuery handlers for this event type, and it can't have inline handlers
3069
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3070
		}
3071
3072
		// Caller can pass in an Event, Object, or just an event type string
3073
		event = typeof event === "object" ?
3074
			// jQuery.Event object
3075
			event[ jQuery.expando ] ? event :
3076
			// Object literal
3077
			new jQuery.Event( type, event ) :
3078
			// Just the event type (string)
3079
			new jQuery.Event( type );
3080
3081
		event.type = type;
3082
		event.isTrigger = true;
3083
		event.exclusive = exclusive;
0 ignored issues
show
Bug introduced by
The variable exclusive does not seem to be initialized in case type.indexOf("!") >= 0 on line 3054 is false. Are you sure this can never be the case?
Loading history...
3084
		event.namespace = namespaces.join( "." );
3085
		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
3086
		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
3087
3088
		// Handle a global trigger
3089
		if ( !elem ) {
3090
3091
			// TODO: Stop taunting the data cache; remove global events and always attach to document
3092
			cache = jQuery.cache;
3093
			for ( i in cache ) {
3094
				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
3095
					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
3096
				}
3097
			}
3098
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3099
		}
3100
3101
		// Clean up the event in case it is being reused
3102
		event.result = undefined;
3103
		if ( !event.target ) {
3104
			event.target = elem;
3105
		}
3106
3107
		// Clone any incoming data and prepend the event, creating the handler arg list
3108
		data = data != null ? jQuery.makeArray( data ) : [];
3109
		data.unshift( event );
3110
3111
		// Allow special events to draw outside the lines
3112
		special = jQuery.event.special[ type ] || {};
3113
		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
3114
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3115
		}
3116
3117
		// Determine event propagation path in advance, per W3C events spec (#9951)
3118
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
3119
		eventPath = [[ elem, special.bindType || type ]];
3120
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
3121
3122
			bubbleType = special.delegateType || type;
3123
			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
3124
			old = null;
3125
			for ( ; cur; cur = cur.parentNode ) {
3126
				eventPath.push([ cur, bubbleType ]);
3127
				old = cur;
3128
			}
3129
3130
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
3131
			if ( old && old === elem.ownerDocument ) {
3132
				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
3133
			}
3134
		}
3135
3136
		// Fire handlers on the event path
3137
		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
3138
3139
			cur = eventPath[i][0];
3140
			event.type = eventPath[i][1];
3141
3142
			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
3143
			if ( handle ) {
3144
				handle.apply( cur, data );
3145
			}
3146
			// Note that this is a bare JS function and not a jQuery handler
3147
			handle = ontype && cur[ ontype ];
3148
			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
3149
				event.preventDefault();
3150
			}
3151
		}
3152
		event.type = type;
3153
3154
		// If nobody prevented the default action, do it now
3155
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
3156
3157
			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
3158
				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3159
3160
				// Call a native DOM method on the target with the same name name as the event.
3161
				// Can't use an .isFunction() check here because IE6/7 fails that test.
3162
				// Don't do default actions on window, that's where global variables be (#6170)
3163
				// IE<9 dies on focus/blur to hidden element (#1486)
3164
				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
3165
3166
					// Don't re-trigger an onFOO event when we call its FOO() method
3167
					old = elem[ ontype ];
3168
3169
					if ( old ) {
3170
						elem[ ontype ] = null;
3171
					}
3172
3173
					// Prevent re-triggering of the same event, since we already bubbled it above
3174
					jQuery.event.triggered = type;
3175
					elem[ type ]();
3176
					jQuery.event.triggered = undefined;
3177
3178
					if ( old ) {
3179
						elem[ ontype ] = old;
3180
					}
3181
				}
3182
			}
3183
		}
3184
3185
		return event.result;
3186
	},
3187
3188
	dispatch: function( event ) {
3189
3190
		// Make a writable jQuery.Event from the native event object
3191
		event = jQuery.event.fix( event || window.event );
3192
3193
		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
3194
			delegateCount = handlers.delegateCount,
3195
			args = [].slice.call( arguments, 0 ),
3196
			run_all = !event.exclusive && !event.namespace,
3197
			handlerQueue = [],
3198
			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
3199
3200
		// Use the fix-ed jQuery.Event rather than the (read-only) native event
3201
		args[0] = event;
3202
		event.delegateTarget = this;
3203
3204
		// Determine handlers that should run if there are delegated events
3205
		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
3206
		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
3207
3208
			// Pregenerate a single jQuery object for reuse with .is()
3209
			jqcur = jQuery(this);
3210
			jqcur.context = this.ownerDocument || this;
3211
3212
			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
3213
				selMatch = {};
3214
				matches = [];
3215
				jqcur[0] = cur;
3216
				for ( i = 0; i < delegateCount; i++ ) {
3217
					handleObj = handlers[ i ];
3218
					sel = handleObj.selector;
3219
3220
					if ( selMatch[ sel ] === undefined ) {
3221
						selMatch[ sel ] = (
3222
							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
3223
						);
3224
					}
3225
					if ( selMatch[ sel ] ) {
3226
						matches.push( handleObj );
3227
					}
3228
				}
3229
				if ( matches.length ) {
3230
					handlerQueue.push({ elem: cur, matches: matches });
3231
				}
3232
			}
3233
		}
3234
3235
		// Add the remaining (directly-bound) handlers
3236
		if ( handlers.length > delegateCount ) {
3237
			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
3238
		}
3239
3240
		// Run delegates first; they may want to stop propagation beneath us
3241
		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
3242
			matched = handlerQueue[ i ];
3243
			event.currentTarget = matched.elem;
3244
3245
			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
3246
				handleObj = matched.matches[ j ];
3247
3248
				// Triggered event must either 1) be non-exclusive and have no namespace, or
3249
				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
3250
				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
3251
3252
					event.data = handleObj.data;
3253
					event.handleObj = handleObj;
3254
3255
					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
3256
							.apply( matched.elem, args );
3257
3258
					if ( ret !== undefined ) {
3259
						event.result = ret;
3260
						if ( ret === false ) {
3261
							event.preventDefault();
3262
							event.stopPropagation();
3263
						}
3264
					}
3265
				}
3266
			}
3267
		}
3268
3269
		return event.result;
3270
	},
3271
3272
	// Includes some event props shared by KeyEvent and MouseEvent
3273
	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
3274
	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
3275
3276
	fixHooks: {},
3277
3278
	keyHooks: {
3279
		props: "char charCode key keyCode".split(" "),
3280
		filter: function( event, original ) {
3281
3282
			// Add which for key events
3283
			if ( event.which == null ) {
3284
				event.which = original.charCode != null ? original.charCode : original.keyCode;
3285
			}
3286
3287
			return event;
3288
		}
3289
	},
3290
3291
	mouseHooks: {
3292
		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
3293
		filter: function( event, original ) {
3294
			var eventDoc, doc, body,
3295
				button = original.button,
3296
				fromElement = original.fromElement;
3297
3298
			// Calculate pageX/Y if missing and clientX/Y available
3299
			if ( event.pageX == null && original.clientX != null ) {
3300
				eventDoc = event.target.ownerDocument || document;
3301
				doc = eventDoc.documentElement;
3302
				body = eventDoc.body;
3303
3304
				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
3305
				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
3306
			}
3307
3308
			// Add relatedTarget, if necessary
3309
			if ( !event.relatedTarget && fromElement ) {
3310
				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
3311
			}
3312
3313
			// Add which for click: 1 === left; 2 === middle; 3 === right
3314
			// Note: button is not normalized, so don't use it
3315
			if ( !event.which && button !== undefined ) {
3316
				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
3317
			}
3318
3319
			return event;
3320
		}
3321
	},
3322
3323
	fix: function( event ) {
3324
		if ( event[ jQuery.expando ] ) {
3325
			return event;
3326
		}
3327
3328
		// Create a writable copy of the event object and normalize some properties
3329
		var i, prop,
3330
			originalEvent = event,
3331
			fixHook = jQuery.event.fixHooks[ event.type ] || {},
3332
			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
3333
3334
		event = jQuery.Event( originalEvent );
3335
3336
		for ( i = copy.length; i; ) {
3337
			prop = copy[ --i ];
3338
			event[ prop ] = originalEvent[ prop ];
3339
		}
3340
3341
		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
3342
		if ( !event.target ) {
3343
			event.target = originalEvent.srcElement || document;
3344
		}
3345
3346
		// Target should not be a text node (#504, Safari)
3347
		if ( event.target.nodeType === 3 ) {
3348
			event.target = event.target.parentNode;
3349
		}
3350
3351
		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
3352
		if ( event.metaKey === undefined ) {
3353
			event.metaKey = event.ctrlKey;
3354
		}
3355
3356
		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
3357
	},
3358
3359
	special: {
3360
		ready: {
3361
			// Make sure the ready event is setup
3362
			setup: jQuery.bindReady
3363
		},
3364
3365
		load: {
3366
			// Prevent triggered image.load events from bubbling to window.load
3367
			noBubble: true
3368
		},
3369
3370
		focus: {
3371
			delegateType: "focusin"
3372
		},
3373
		blur: {
3374
			delegateType: "focusout"
3375
		},
3376
3377
		beforeunload: {
3378
			setup: function( data, namespaces, eventHandle ) {
3379
				// We only want to do this special case on windows
3380
				if ( jQuery.isWindow( this ) ) {
3381
					this.onbeforeunload = eventHandle;
3382
				}
3383
			},
3384
3385
			teardown: function( namespaces, eventHandle ) {
3386
				if ( this.onbeforeunload === eventHandle ) {
3387
					this.onbeforeunload = null;
3388
				}
3389
			}
3390
		}
3391
	},
3392
3393
	simulate: function( type, elem, event, bubble ) {
3394
		// Piggyback on a donor event to simulate a different one.
3395
		// Fake originalEvent to avoid donor's stopPropagation, but if the
3396
		// simulated event prevents default then we do the same on the donor.
3397
		var e = jQuery.extend(
3398
			new jQuery.Event(),
3399
			event,
3400
			{ type: type,
3401
				isSimulated: true,
3402
				originalEvent: {}
3403
			}
3404
		);
3405
		if ( bubble ) {
3406
			jQuery.event.trigger( e, null, elem );
3407
		} else {
3408
			jQuery.event.dispatch.call( elem, e );
3409
		}
3410
		if ( e.isDefaultPrevented() ) {
3411
			event.preventDefault();
3412
		}
3413
	}
3414
};
3415
3416
// Some plugins are using, but it's undocumented/deprecated and will be removed.
3417
// The 1.7 special event interface should provide all the hooks needed now.
3418
jQuery.event.handle = jQuery.event.dispatch;
3419
3420
jQuery.removeEvent = document.removeEventListener ?
3421
	function( elem, type, handle ) {
3422
		if ( elem.removeEventListener ) {
3423
			elem.removeEventListener( type, handle, false );
3424
		}
3425
	} :
3426
	function( elem, type, handle ) {
3427
		if ( elem.detachEvent ) {
3428
			elem.detachEvent( "on" + type, handle );
3429
		}
3430
	};
3431
3432
jQuery.Event = function( src, props ) {
3433
	// Allow instantiation without the 'new' keyword
3434
	if ( !(this instanceof jQuery.Event) ) {
3435
		return new jQuery.Event( src, props );
3436
	}
3437
3438
	// Event object
3439
	if ( src && src.type ) {
3440
		this.originalEvent = src;
3441
		this.type = src.type;
3442
3443
		// Events bubbling up the document may have been marked as prevented
3444
		// by a handler lower down the tree; reflect the correct value.
3445
		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
3446
			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
3447
3448
	// Event type
3449
	} else {
3450
		this.type = src;
3451
	}
3452
3453
	// Put explicitly provided properties onto the event object
3454
	if ( props ) {
3455
		jQuery.extend( this, props );
3456
	}
3457
3458
	// Create a timestamp if incoming event doesn't have one
3459
	this.timeStamp = src && src.timeStamp || jQuery.now();
3460
3461
	// Mark it as fixed
3462
	this[ jQuery.expando ] = true;
3463
};
3464
3465
function returnFalse() {
3466
	return false;
3467
}
3468
function returnTrue() {
3469
	return true;
3470
}
3471
3472
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3473
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3474
jQuery.Event.prototype = {
3475
	preventDefault: function() {
3476
		this.isDefaultPrevented = returnTrue;
3477
3478
		var e = this.originalEvent;
3479
		if ( !e ) {
3480
			return;
3481
		}
3482
3483
		// if preventDefault exists run it on the original event
3484
		if ( e.preventDefault ) {
3485
			e.preventDefault();
3486
3487
		// otherwise set the returnValue property of the original event to false (IE)
3488
		} else {
3489
			e.returnValue = false;
3490
		}
3491
	},
3492
	stopPropagation: function() {
3493
		this.isPropagationStopped = returnTrue;
3494
3495
		var e = this.originalEvent;
3496
		if ( !e ) {
3497
			return;
3498
		}
3499
		// if stopPropagation exists run it on the original event
3500
		if ( e.stopPropagation ) {
3501
			e.stopPropagation();
3502
		}
3503
		// otherwise set the cancelBubble property of the original event to true (IE)
3504
		e.cancelBubble = true;
3505
	},
3506
	stopImmediatePropagation: function() {
3507
		this.isImmediatePropagationStopped = returnTrue;
3508
		this.stopPropagation();
3509
	},
3510
	isDefaultPrevented: returnFalse,
3511
	isPropagationStopped: returnFalse,
3512
	isImmediatePropagationStopped: returnFalse
3513
};
3514
3515
// Create mouseenter/leave events using mouseover/out and event-time checks
3516
jQuery.each({
3517
	mouseenter: "mouseover",
3518
	mouseleave: "mouseout"
3519
}, function( orig, fix ) {
3520
	jQuery.event.special[ orig ] = {
3521
		delegateType: fix,
3522
		bindType: fix,
3523
3524
		handle: function( event ) {
3525
			var target = this,
3526
				related = event.relatedTarget,
3527
				handleObj = event.handleObj,
3528
				selector = handleObj.selector,
3529
				ret;
3530
3531
			// For mousenter/leave call the handler if related is outside the target.
3532
			// NB: No relatedTarget if the mouse left/entered the browser window
3533
			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
3534
				event.type = handleObj.origType;
3535
				ret = handleObj.handler.apply( this, arguments );
3536
				event.type = fix;
3537
			}
3538
			return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case !related || related !== ...ntains(target, related) on line 3533 is false. Are you sure this can never be the case?
Loading history...
3539
		}
3540
	};
3541
});
3542
3543
// IE submit delegation
3544
if ( !jQuery.support.submitBubbles ) {
3545
3546
	jQuery.event.special.submit = {
3547
		setup: function() {
3548
			// Only need this for delegated form submit events
3549
			if ( jQuery.nodeName( this, "form" ) ) {
3550
				return false;
3551
			}
3552
3553
			// Lazy-add a submit handler when a descendant form may potentially be submitted
3554
			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
3555
				// Node name check avoids a VML-related crash in IE (#9807)
3556
				var elem = e.target,
3557
					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
3558
				if ( form && !form._submit_attached ) {
3559
					jQuery.event.add( form, "submit._submit", function( event ) {
3560
						// If form was submitted by the user, bubble the event up the tree
3561
						if ( this.parentNode && !event.isTrigger ) {
3562
							jQuery.event.simulate( "submit", this.parentNode, event, true );
3563
						}
3564
					});
3565
					form._submit_attached = true;
3566
				}
3567
			});
3568
			// return undefined since we don't need an event listener
3569
		},
3570
3571
		teardown: function() {
3572
			// Only need this for delegated form submit events
3573
			if ( jQuery.nodeName( this, "form" ) ) {
3574
				return false;
3575
			}
3576
3577
			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
3578
			jQuery.event.remove( this, "._submit" );
3579
		}
3580
	};
3581
}
3582
3583
// IE change delegation and checkbox/radio fix
3584
if ( !jQuery.support.changeBubbles ) {
3585
3586
	jQuery.event.special.change = {
3587
3588
		setup: function() {
3589
3590
			if ( rformElems.test( this.nodeName ) ) {
3591
				// IE doesn't fire change on a check/radio until blur; trigger it on click
3592
				// after a propertychange. Eat the blur-change in special.change.handle.
3593
				// This still fires onchange a second time for check/radio after blur.
3594
				if ( this.type === "checkbox" || this.type === "radio" ) {
3595
					jQuery.event.add( this, "propertychange._change", function( event ) {
3596
						if ( event.originalEvent.propertyName === "checked" ) {
3597
							this._just_changed = true;
3598
						}
3599
					});
3600
					jQuery.event.add( this, "click._change", function( event ) {
3601
						if ( this._just_changed && !event.isTrigger ) {
3602
							this._just_changed = false;
3603
							jQuery.event.simulate( "change", this, event, true );
3604
						}
3605
					});
3606
				}
3607
				return false;
3608
			}
3609
			// Delegated event; lazy-add a change handler on descendant inputs
3610
			jQuery.event.add( this, "beforeactivate._change", function( e ) {
3611
				var elem = e.target;
3612
3613
				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
3614
					jQuery.event.add( elem, "change._change", function( event ) {
3615
						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
3616
							jQuery.event.simulate( "change", this.parentNode, event, true );
3617
						}
3618
					});
3619
					elem._change_attached = true;
3620
				}
3621
			});
3622
		},
3623
3624
		handle: function( event ) {
3625
			var elem = event.target;
3626
3627
			// Swallow native change events from checkbox/radio, we already triggered them above
3628
			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
3629
				return event.handleObj.handler.apply( this, arguments );
3630
			}
3631
		},
3632
3633
		teardown: function() {
3634
			jQuery.event.remove( this, "._change" );
3635
3636
			return rformElems.test( this.nodeName );
3637
		}
3638
	};
3639
}
3640
3641
// Create "bubbling" focus and blur events
3642
if ( !jQuery.support.focusinBubbles ) {
3643
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3644
3645
		// Attach a single capturing handler while someone wants focusin/focusout
3646
		var attaches = 0,
3647
			handler = function( event ) {
3648
				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
3649
			};
3650
3651
		jQuery.event.special[ fix ] = {
3652
			setup: function() {
3653
				if ( attaches++ === 0 ) {
3654
					document.addEventListener( orig, handler, true );
3655
				}
3656
			},
3657
			teardown: function() {
3658
				if ( --attaches === 0 ) {
3659
					document.removeEventListener( orig, handler, true );
3660
				}
3661
			}
3662
		};
3663
	});
3664
}
3665
3666
jQuery.fn.extend({
3667
3668
	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
3669
		var origFn, type;
3670
3671
		// Types can be a map of types/handlers
3672
		if ( typeof types === "object" ) {
3673
			// ( types-Object, selector, data )
3674
			if ( typeof selector !== "string" ) {
3675
				// ( types-Object, data )
3676
				data = selector;
3677
				selector = undefined;
3678
			}
3679
			for ( type in types ) {
3680
				this.on( type, selector, data, types[ type ], one );
3681
			}
3682
			return this;
3683
		}
3684
3685 View Code Duplication
		if ( data == null && fn == null ) {
3686
			// ( types, fn )
3687
			fn = selector;
3688
			data = selector = undefined;
3689
		} else if ( fn == null ) {
3690
			if ( typeof selector === "string" ) {
3691
				// ( types, selector, fn )
3692
				fn = data;
3693
				data = undefined;
3694
			} else {
3695
				// ( types, data, fn )
3696
				fn = data;
3697
				data = selector;
3698
				selector = undefined;
3699
			}
3700
		}
3701
		if ( fn === false ) {
3702
			fn = returnFalse;
3703
		} else if ( !fn ) {
3704
			return this;
3705
		}
3706
3707
		if ( one === 1 ) {
3708
			origFn = fn;
3709
			fn = function( event ) {
3710
				// Can use an empty set, since event contains the info
3711
				jQuery().off( event );
3712
				return origFn.apply( this, arguments );
3713
			};
3714
			// Use same guid so caller can remove using origFn
3715
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
3716
		}
3717
		return this.each( function() {
3718
			jQuery.event.add( this, types, fn, data, selector );
3719
		});
3720
	},
3721
	one: function( types, selector, data, fn ) {
3722
		return this.on.call( this, types, selector, data, fn, 1 );
3723
	},
3724
	off: function( types, selector, fn ) {
3725
		if ( types && types.preventDefault && types.handleObj ) {
3726
			// ( event )  dispatched jQuery.Event
3727
			var handleObj = types.handleObj;
3728
			jQuery( types.delegateTarget ).off(
3729
				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
3730
				handleObj.selector,
3731
				handleObj.handler
3732
			);
3733
			return this;
3734
		}
3735
		if ( typeof types === "object" ) {
3736
			// ( types-object [, selector] )
3737
			for ( var type in types ) {
3738
				this.off( type, selector, types[ type ] );
3739
			}
3740
			return this;
3741
		}
3742
		if ( selector === false || typeof selector === "function" ) {
3743
			// ( types [, fn] )
3744
			fn = selector;
3745
			selector = undefined;
3746
		}
3747
		if ( fn === false ) {
3748
			fn = returnFalse;
3749
		}
3750
		return this.each(function() {
3751
			jQuery.event.remove( this, types, fn, selector );
3752
		});
3753
	},
3754
3755
	bind: function( types, data, fn ) {
3756
		return this.on( types, null, data, fn );
3757
	},
3758
	unbind: function( types, fn ) {
3759
		return this.off( types, null, fn );
3760
	},
3761
3762
	live: function( types, data, fn ) {
3763
		jQuery( this.context ).on( types, this.selector, data, fn );
3764
		return this;
3765
	},
3766
	die: function( types, fn ) {
3767
		jQuery( this.context ).off( types, this.selector || "**", fn );
3768
		return this;
3769
	},
3770
3771
	delegate: function( selector, types, data, fn ) {
3772
		return this.on( types, selector, data, fn );
3773
	},
3774
	undelegate: function( selector, types, fn ) {
3775
		// ( namespace ) or ( selector, types [, fn] )
3776
		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
3777
	},
3778
3779
	trigger: function( type, data ) {
3780
		return this.each(function() {
3781
			jQuery.event.trigger( type, data, this );
3782
		});
3783
	},
3784
	triggerHandler: function( type, data ) {
3785
		if ( this[0] ) {
3786
			return jQuery.event.trigger( type, data, this[0], true );
3787
		}
3788
	},
3789
3790
	toggle: function( fn ) {
3791
		// Save reference to arguments for access in closure
3792
		var args = arguments,
3793
			guid = fn.guid || jQuery.guid++,
3794
			i = 0,
3795
			toggler = function( event ) {
3796
				// Figure out which function to execute
3797
				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3798
				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3799
3800
				// Make sure that clicks stop
3801
				event.preventDefault();
3802
3803
				// and execute the function
3804
				return args[ lastToggle ].apply( this, arguments ) || false;
3805
			};
3806
3807
		// link all the functions, so any of them can unbind this click handler
3808
		toggler.guid = guid;
3809
		while ( i < args.length ) {
3810
			args[ i++ ].guid = guid;
3811
		}
3812
3813
		return this.click( toggler );
3814
	},
3815
3816
	hover: function( fnOver, fnOut ) {
3817
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3818
	}
3819
});
3820
3821
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3822
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3823
	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
3824
3825
	// Handle event binding
3826
	jQuery.fn[ name ] = function( data, fn ) {
3827
		if ( fn == null ) {
3828
			fn = data;
3829
			data = null;
3830
		}
3831
3832
		return arguments.length > 0 ?
3833
			this.on( name, null, data, fn ) :
3834
			this.trigger( name );
3835
	};
3836
3837
	if ( jQuery.attrFn ) {
3838
		jQuery.attrFn[ name ] = true;
3839
	}
3840
3841
	if ( rkeyEvent.test( name ) ) {
3842
		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
3843
	}
3844
3845
	if ( rmouseEvent.test( name ) ) {
3846
		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
3847
	}
3848
});
3849
3850
3851
3852
/*!
3853
 * Sizzle CSS Selector Engine
3854
 *  Copyright 2011, The Dojo Foundation
3855
 *  Released under the MIT, BSD, and GPL Licenses.
3856
 *  More information: http://sizzlejs.com/
3857
 */
3858
(function(){
3859
3860
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3861
	expando = "sizcache" + (Math.random() + '').replace('.', ''),
3862
	done = 0,
3863
	toString = Object.prototype.toString,
3864
	hasDuplicate = false,
3865
	baseHasDuplicate = true,
3866
	rBackslash = /\\/g,
3867
	rReturn = /\r\n/g,
3868
	rNonWord = /\W/;
3869
3870
// Here we check if the JavaScript engine is using some sort of
3871
// optimization where it does not always call our comparision
3872
// function. If that is the case, discard the hasDuplicate value.
3873
//   Thus far that includes Google Chrome.
3874
[0, 0].sort(function() {
3875
	baseHasDuplicate = false;
3876
	return 0;
3877
});
3878
3879 View Code Duplication
var Sizzle = function( selector, context, results, seed ) {
3880
	results = results || [];
3881
	context = context || document;
3882
3883
	var origContext = context;
3884
3885
	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3886
		return [];
3887
	}
3888
	
3889
	if ( !selector || typeof selector !== "string" ) {
3890
		return results;
3891
	}
3892
3893
	var m, set, checkSet, extra, ret, cur, pop, i,
3894
		prune = true,
3895
		contextXML = Sizzle.isXML( context ),
3896
		parts = [],
3897
		soFar = selector;
3898
	
3899
	// Reset the position of the chunker regexp (start from head)
3900
	do {
3901
		chunker.exec( "" );
3902
		m = chunker.exec( soFar );
3903
3904
		if ( m ) {
3905
			soFar = m[3];
3906
		
3907
			parts.push( m[1] );
3908
		
3909
			if ( m[2] ) {
3910
				extra = m[3];
3911
				break;
3912
			}
3913
		}
3914
	} while ( m );
3915
3916
	if ( parts.length > 1 && origPOS.exec( selector ) ) {
3917
3918
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3919
			set = posProcess( parts[0] + parts[1], context, seed );
3920
3921
		} else {
3922
			set = Expr.relative[ parts[0] ] ?
3923
				[ context ] :
3924
				Sizzle( parts.shift(), context );
3925
3926
			while ( parts.length ) {
3927
				selector = parts.shift();
3928
3929
				if ( Expr.relative[ selector ] ) {
3930
					selector += parts.shift();
3931
				}
3932
				
3933
				set = posProcess( selector, set, seed );
3934
			}
3935
		}
3936
3937
	} else {
3938
		// Take a shortcut and set the context if the root selector is an ID
3939
		// (but not if it'll be faster if the inner selector is an ID)
3940
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3941
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3942
3943
			ret = Sizzle.find( parts.shift(), context, contextXML );
3944
			context = ret.expr ?
3945
				Sizzle.filter( ret.expr, ret.set )[0] :
3946
				ret.set[0];
3947
		}
3948
3949
		if ( context ) {
3950
			ret = seed ?
3951
				{ expr: parts.pop(), set: makeArray(seed) } :
3952
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3953
3954
			set = ret.expr ?
3955
				Sizzle.filter( ret.expr, ret.set ) :
3956
				ret.set;
3957
3958
			if ( parts.length > 0 ) {
3959
				checkSet = makeArray( set );
3960
3961
			} else {
3962
				prune = false;
3963
			}
3964
3965
			while ( parts.length ) {
3966
				cur = parts.pop();
3967
				pop = cur;
3968
3969
				if ( !Expr.relative[ cur ] ) {
3970
					cur = "";
3971
				} else {
3972
					pop = parts.pop();
3973
				}
3974
3975
				if ( pop == null ) {
3976
					pop = context;
3977
				}
3978
3979
				Expr.relative[ cur ]( checkSet, pop, contextXML );
0 ignored issues
show
Bug introduced by
The variable checkSet seems to not be initialized for all possible execution paths. Are you sure cur handles undefined variables?
Loading history...
3980
			}
3981
3982
		} else {
3983
			checkSet = parts = [];
3984
		}
3985
	}
3986
3987
	if ( !checkSet ) {
3988
		checkSet = set;
3989
	}
3990
3991
	if ( !checkSet ) {
3992
		Sizzle.error( cur || selector );
3993
	}
3994
3995
	if ( toString.call(checkSet) === "[object Array]" ) {
3996
		if ( !prune ) {
3997
			results.push.apply( results, checkSet );
3998
3999
		} else if ( context && context.nodeType === 1 ) {
4000
			for ( i = 0; checkSet[i] != null; i++ ) {
4001
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
4002
					results.push( set[i] );
4003
				}
4004
			}
4005
4006
		} else {
4007
			for ( i = 0; checkSet[i] != null; i++ ) {
4008
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4009
					results.push( set[i] );
4010
				}
4011
			}
4012
		}
4013
4014
	} else {
4015
		makeArray( checkSet, results );
4016
	}
4017
4018
	if ( extra ) {
4019
		Sizzle( extra, origContext, results, seed );
4020
		Sizzle.uniqueSort( results );
4021
	}
4022
4023
	return results;
4024
};
4025
4026
Sizzle.uniqueSort = function( results ) {
4027
	if ( sortOrder ) {
4028
		hasDuplicate = baseHasDuplicate;
4029
		results.sort( sortOrder );
4030
4031
		if ( hasDuplicate ) {
4032
			for ( var i = 1; i < results.length; i++ ) {
4033
				if ( results[i] === results[ i - 1 ] ) {
4034
					results.splice( i--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
4035
				}
4036
			}
4037
		}
4038
	}
4039
4040
	return results;
4041
};
4042
4043
Sizzle.matches = function( expr, set ) {
4044
	return Sizzle( expr, null, null, set );
4045
};
4046
4047
Sizzle.matchesSelector = function( node, expr ) {
4048
	return Sizzle( expr, null, null, [node] ).length > 0;
4049
};
4050
4051 View Code Duplication
Sizzle.find = function( expr, context, isXML ) {
4052
	var set, i, len, match, type, left;
4053
4054
	if ( !expr ) {
4055
		return [];
4056
	}
4057
4058
	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
4059
		type = Expr.order[i];
4060
		
4061
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4062
			left = match[1];
4063
			match.splice( 1, 1 );
4064
4065
			if ( left.substr( left.length - 1 ) !== "\\" ) {
4066
				match[1] = (match[1] || "").replace( rBackslash, "" );
4067
				set = Expr.find[ type ]( match, context, isXML );
4068
4069
				if ( set != null ) {
4070
					expr = expr.replace( Expr.match[ type ], "" );
4071
					break;
4072
				}
4073
			}
4074
		}
4075
	}
4076
4077
	if ( !set ) {
4078
		set = typeof context.getElementsByTagName !== "undefined" ?
4079
			context.getElementsByTagName( "*" ) :
4080
			[];
4081
	}
4082
4083
	return { set: set, expr: expr };
4084
};
4085
4086 View Code Duplication
Sizzle.filter = function( expr, set, inplace, not ) {
4087
	var match, anyFound,
4088
		type, found, item, filter, left,
4089
		i, pass,
4090
		old = expr,
4091
		result = [],
4092
		curLoop = set,
4093
		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4094
4095
	while ( expr && set.length ) {
4096
		for ( type in Expr.filter ) {
4097
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4098
				filter = Expr.filter[ type ];
4099
				left = match[1];
4100
4101
				anyFound = false;
4102
4103
				match.splice(1,1);
4104
4105
				if ( left.substr( left.length - 1 ) === "\\" ) {
4106
					continue;
4107
				}
4108
4109
				if ( curLoop === result ) {
4110
					result = [];
4111
				}
4112
4113
				if ( Expr.preFilter[ type ] ) {
4114
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4115
4116
					if ( !match ) {
4117
						anyFound = found = true;
4118
4119
					} else if ( match === true ) {
4120
						continue;
4121
					}
4122
				}
4123
4124
				if ( match ) {
4125
					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
4126
						if ( item ) {
4127
							found = filter( item, match, i, curLoop );
4128
							pass = not ^ found;
4129
4130
							if ( inplace && found != null ) {
4131
								if ( pass ) {
4132
									anyFound = true;
4133
4134
								} else {
4135
									curLoop[i] = false;
4136
								}
4137
4138
							} else if ( pass ) {
4139
								result.push( item );
4140
								anyFound = true;
4141
							}
4142
						}
4143
					}
4144
				}
4145
4146
				if ( found !== undefined ) {
4147
					if ( !inplace ) {
4148
						curLoop = result;
4149
					}
4150
4151
					expr = expr.replace( Expr.match[ type ], "" );
4152
4153
					if ( !anyFound ) {
4154
						return [];
4155
					}
4156
4157
					break;
4158
				}
4159
			}
4160
		}
4161
4162
		// Improper expression
4163
		if ( expr === old ) {
4164
			if ( anyFound == null ) {
4165
				Sizzle.error( expr );
4166
4167
			} else {
4168
				break;
4169
			}
4170
		}
4171
4172
		old = expr;
4173
	}
4174
4175
	return curLoop;
4176
};
4177
4178
Sizzle.error = function( msg ) {
4179
	throw new Error( "Syntax error, unrecognized expression: " + msg );
4180
};
4181
4182
/**
4183
 * Utility function for retreiving the text value of an array of DOM nodes
4184
 * @param {Array|Element} elem
4185
 */
4186
var getText = Sizzle.getText = function( elem ) {
4187
    var i, node,
4188
		nodeType = elem.nodeType,
4189
		ret = "";
4190
4191
	if ( nodeType ) {
4192
		if ( nodeType === 1 || nodeType === 9 ) {
4193
			// Use textContent || innerText for elements
4194
			if ( typeof elem.textContent === 'string' ) {
4195
				return elem.textContent;
4196
			} else if ( typeof elem.innerText === 'string' ) {
4197
				// Replace IE's carriage returns
4198
				return elem.innerText.replace( rReturn, '' );
4199
			} else {
4200
				// Traverse it's children
4201
				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
4202
					ret += getText( elem );
4203
				}
4204
			}
4205
		} else if ( nodeType === 3 || nodeType === 4 ) {
4206
			return elem.nodeValue;
4207
		}
4208
	} else {
4209
4210
		// If no nodeType, this is expected to be an array
4211
		for ( i = 0; (node = elem[i]); i++ ) {
4212
			// Do not traverse comment nodes
4213
			if ( node.nodeType !== 8 ) {
4214
				ret += getText( node );
4215
			}
4216
		}
4217
	}
4218
	return ret;
4219
};
4220
4221
var Expr = Sizzle.selectors = {
4222
	order: [ "ID", "NAME", "TAG" ],
4223
4224
	match: {
4225
		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4226
		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4227
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4228
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4229
		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4230
		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4231
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4232
		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4233
	},
4234
4235
	leftMatch: {},
4236
4237
	attrMap: {
4238
		"class": "className",
4239
		"for": "htmlFor"
4240
	},
4241
4242
	attrHandle: {
4243
		href: function( elem ) {
4244
			return elem.getAttribute( "href" );
4245
		},
4246
		type: function( elem ) {
4247
			return elem.getAttribute( "type" );
4248
		}
4249
	},
4250
4251
	relative: {
4252
		"+": function(checkSet, part){
4253
			var isPartStr = typeof part === "string",
4254
				isTag = isPartStr && !rNonWord.test( part ),
4255
				isPartStrNotTag = isPartStr && !isTag;
4256
4257
			if ( isTag ) {
4258
				part = part.toLowerCase();
4259
			}
4260
4261 View Code Duplication
			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4262
				if ( (elem = checkSet[i]) ) {
4263
					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
4264
4265
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4266
						elem || false :
4267
						elem === part;
4268
				}
4269
			}
4270
4271
			if ( isPartStrNotTag ) {
4272
				Sizzle.filter( part, checkSet, true );
4273
			}
4274
		},
4275
4276
		">": function( checkSet, part ) {
4277
			var elem,
4278
				isPartStr = typeof part === "string",
4279
				i = 0,
4280
				l = checkSet.length;
4281
4282
			if ( isPartStr && !rNonWord.test( part ) ) {
4283
				part = part.toLowerCase();
4284
4285
				for ( ; i < l; i++ ) {
4286
					elem = checkSet[i];
4287
4288
					if ( elem ) {
4289
						var parent = elem.parentNode;
4290
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4291
					}
4292
				}
4293
4294
			} else {
4295
				for ( ; i < l; i++ ) {
4296
					elem = checkSet[i];
4297
4298
					if ( elem ) {
4299
						checkSet[i] = isPartStr ?
4300
							elem.parentNode :
4301
							elem.parentNode === part;
4302
					}
4303
				}
4304
4305
				if ( isPartStr ) {
4306
					Sizzle.filter( part, checkSet, true );
4307
				}
4308
			}
4309
		},
4310
4311
		"": function(checkSet, part, isXML){
4312
			var nodeCheck,
4313
				doneName = done++,
4314
				checkFn = dirCheck;
4315
4316
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4317
				part = part.toLowerCase();
4318
				nodeCheck = part;
4319
				checkFn = dirNodeCheck;
4320
			}
4321
4322
			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
0 ignored issues
show
Bug introduced by
The variable nodeCheck does not seem to be initialized in case typeof part === "string" && !rNonWord.test(part) on line 4316 is false. Are you sure the function checkFn handles undefined variables?
Loading history...
4323
		},
4324
4325
		"~": function( checkSet, part, isXML ) {
4326
			var nodeCheck,
4327
				doneName = done++,
4328
				checkFn = dirCheck;
4329
4330
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4331
				part = part.toLowerCase();
4332
				nodeCheck = part;
4333
				checkFn = dirNodeCheck;
4334
			}
4335
4336
			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
0 ignored issues
show
Bug introduced by
The variable nodeCheck does not seem to be initialized in case typeof part === "string" && !rNonWord.test(part) on line 4330 is false. Are you sure the function checkFn handles undefined variables?
Loading history...
4337
		}
4338
	},
4339
4340
	find: {
4341
		ID: function( match, context, isXML ) {
4342
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4343
				var m = context.getElementById(match[1]);
4344
				// Check parentNode to catch when Blackberry 4.6 returns
4345
				// nodes that are no longer in the document #6963
4346
				return m && m.parentNode ? [m] : [];
4347
			}
4348
		},
4349
4350
		NAME: function( match, context ) {
4351
			if ( typeof context.getElementsByName !== "undefined" ) {
4352
				var ret = [],
4353
					results = context.getElementsByName( match[1] );
4354
4355
				for ( var i = 0, l = results.length; i < l; i++ ) {
4356
					if ( results[i].getAttribute("name") === match[1] ) {
4357
						ret.push( results[i] );
4358
					}
4359
				}
4360
4361
				return ret.length === 0 ? null : ret;
4362
			}
4363
		},
4364
4365
		TAG: function( match, context ) {
4366
			if ( typeof context.getElementsByTagName !== "undefined" ) {
4367
				return context.getElementsByTagName( match[1] );
4368
			}
4369
		}
4370
	},
4371
	preFilter: {
4372
		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4373
			match = " " + match[1].replace( rBackslash, "" ) + " ";
4374
4375
			if ( isXML ) {
4376
				return match;
4377
			}
4378
4379 View Code Duplication
			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4380
				if ( elem ) {
4381
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4382
						if ( !inplace ) {
4383
							result.push( elem );
4384
						}
4385
4386
					} else if ( inplace ) {
4387
						curLoop[i] = false;
4388
					}
4389
				}
4390
			}
4391
4392
			return false;
4393
		},
4394
4395
		ID: function( match ) {
4396
			return match[1].replace( rBackslash, "" );
4397
		},
4398
4399
		TAG: function( match, curLoop ) {
4400
			return match[1].replace( rBackslash, "" ).toLowerCase();
4401
		},
4402
4403 View Code Duplication
		CHILD: function( match ) {
4404
			if ( match[1] === "nth" ) {
4405
				if ( !match[2] ) {
4406
					Sizzle.error( match[0] );
4407
				}
4408
4409
				match[2] = match[2].replace(/^\+|\s*/g, '');
4410
4411
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4412
				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4413
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4414
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4415
4416
				// calculate the numbers (first)n+(last) including if they are negative
4417
				match[2] = (test[1] + (test[2] || 1)) - 0;
4418
				match[3] = test[3] - 0;
4419
			}
4420
			else if ( match[2] ) {
4421
				Sizzle.error( match[0] );
4422
			}
4423
4424
			// TODO: Move to normal caching system
4425
			match[0] = done++;
4426
4427
			return match;
4428
		},
4429
4430
		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4431
			var name = match[1] = match[1].replace( rBackslash, "" );
4432
			
4433
			if ( !isXML && Expr.attrMap[name] ) {
4434
				match[1] = Expr.attrMap[name];
4435
			}
4436
4437
			// Handle if an un-quoted value was used
4438
			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4439
4440
			if ( match[2] === "~=" ) {
4441
				match[4] = " " + match[4] + " ";
4442
			}
4443
4444
			return match;
4445
		},
4446
4447 View Code Duplication
		PSEUDO: function( match, curLoop, inplace, result, not ) {
4448
			if ( match[1] === "not" ) {
4449
				// If we're dealing with a complex expression, or a simple one
4450
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4451
					match[3] = Sizzle(match[3], null, null, curLoop);
4452
4453
				} else {
4454
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4455
4456
					if ( !inplace ) {
4457
						result.push.apply( result, ret );
4458
					}
4459
4460
					return false;
4461
				}
4462
4463
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4464
				return true;
4465
			}
4466
			
4467
			return match;
4468
		},
4469
4470
		POS: function( match ) {
4471
			match.unshift( true );
4472
4473
			return match;
4474
		}
4475
	},
4476
	
4477
	filters: {
4478
		enabled: function( elem ) {
4479
			return elem.disabled === false && elem.type !== "hidden";
4480
		},
4481
4482
		disabled: function( elem ) {
4483
			return elem.disabled === true;
4484
		},
4485
4486
		checked: function( elem ) {
4487
			return elem.checked === true;
4488
		},
4489
		
4490
		selected: function( elem ) {
4491
			// Accessing this property makes selected-by-default
4492
			// options in Safari work properly
4493
			if ( elem.parentNode ) {
4494
				elem.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to elem.parentNode.selectedIndex is not used.
Loading history...
4495
			}
4496
			
4497
			return elem.selected === true;
4498
		},
4499
4500
		parent: function( elem ) {
4501
			return !!elem.firstChild;
4502
		},
4503
4504
		empty: function( elem ) {
4505
			return !elem.firstChild;
4506
		},
4507
4508
		has: function( elem, i, match ) {
4509
			return !!Sizzle( match[3], elem ).length;
4510
		},
4511
4512
		header: function( elem ) {
4513
			return (/h\d/i).test( elem.nodeName );
4514
		},
4515
4516
		text: function( elem ) {
4517
			var attr = elem.getAttribute( "type" ), type = elem.type;
4518
			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
4519
			// use getAttribute instead to test this case
4520
			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4521
		},
4522
4523
		radio: function( elem ) {
4524
			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4525
		},
4526
4527
		checkbox: function( elem ) {
4528
			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4529
		},
4530
4531
		file: function( elem ) {
4532
			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4533
		},
4534
4535
		password: function( elem ) {
4536
			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4537
		},
4538
4539
		submit: function( elem ) {
4540
			var name = elem.nodeName.toLowerCase();
4541
			return (name === "input" || name === "button") && "submit" === elem.type;
4542
		},
4543
4544
		image: function( elem ) {
4545
			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4546
		},
4547
4548
		reset: function( elem ) {
4549
			var name = elem.nodeName.toLowerCase();
4550
			return (name === "input" || name === "button") && "reset" === elem.type;
4551
		},
4552
4553
		button: function( elem ) {
4554
			var name = elem.nodeName.toLowerCase();
4555
			return name === "input" && "button" === elem.type || name === "button";
4556
		},
4557
4558
		input: function( elem ) {
4559
			return (/input|select|textarea|button/i).test( elem.nodeName );
4560
		},
4561
4562
		focus: function( elem ) {
4563
			return elem === elem.ownerDocument.activeElement;
4564
		}
4565
	},
4566
	setFilters: {
4567
		first: function( elem, i ) {
4568
			return i === 0;
4569
		},
4570
4571
		last: function( elem, i, match, array ) {
4572
			return i === array.length - 1;
4573
		},
4574
4575
		even: function( elem, i ) {
4576
			return i % 2 === 0;
4577
		},
4578
4579
		odd: function( elem, i ) {
4580
			return i % 2 === 1;
4581
		},
4582
4583
		lt: function( elem, i, match ) {
4584
			return i < match[3] - 0;
4585
		},
4586
4587
		gt: function( elem, i, match ) {
4588
			return i > match[3] - 0;
4589
		},
4590
4591
		nth: function( elem, i, match ) {
4592
			return match[3] - 0 === i;
4593
		},
4594
4595
		eq: function( elem, i, match ) {
4596
			return match[3] - 0 === i;
4597
		}
4598
	},
4599
	filter: {
4600 View Code Duplication
		PSEUDO: function( elem, match, i, array ) {
4601
			var name = match[1],
4602
				filter = Expr.filters[ name ];
4603
4604
			if ( filter ) {
4605
				return filter( elem, i, match, array );
4606
4607
			} else if ( name === "contains" ) {
4608
				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
4609
4610
			} else if ( name === "not" ) {
4611
				var not = match[3];
4612
4613
				for ( var j = 0, l = not.length; j < l; j++ ) {
4614
					if ( not[j] === elem ) {
4615
						return false;
4616
					}
4617
				}
4618
4619
				return true;
4620
4621
			} else {
4622
				Sizzle.error( name );
4623
			}
4624
		},
4625
4626
		CHILD: function( elem, match ) {
4627
			var first, last,
4628
				doneName, parent, cache,
4629
				count, diff,
4630
				type = match[1],
4631
				node = elem;
4632
4633
			switch ( type ) {
4634
				case "only":
4635
				case "first":
4636
					while ( (node = node.previousSibling) )	 {
4637
						if ( node.nodeType === 1 ) { 
4638
							return false; 
4639
						}
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
4640
					}
4641
4642
					if ( type === "first" ) { 
4643
						return true; 
4644
					}
4645
4646
					node = elem;
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
4647
4648
				case "last":
4649
					while ( (node = node.nextSibling) )	 {
4650
						if ( node.nodeType === 1 ) { 
4651
							return false; 
4652
						}
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
4653
					}
4654
4655
					return true;
4656
4657
				case "nth":
4658
					first = match[2];
4659
					last = match[3];
4660
4661
					if ( first === 1 && last === 0 ) {
4662
						return true;
4663
					}
4664
					
4665
					doneName = match[0];
4666
					parent = elem.parentNode;
4667
	
4668
					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
4669
						count = 0;
4670
						
4671
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
4672
							if ( node.nodeType === 1 ) {
4673
								node.nodeIndex = ++count;
4674
							}
4675
						} 
4676
4677
						parent[ expando ] = doneName;
4678
					}
4679
					
4680
					diff = elem.nodeIndex - last;
4681
4682
					if ( first === 0 ) {
4683
						return diff === 0;
4684
4685
					} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
4686
						return ( diff % first === 0 && diff / first >= 0 );
4687
					}
4688
			}
0 ignored issues
show
Comprehensibility introduced by
There is no default case in this switch, so nothing gets returned when all cases fail. You might want to consider adding a default or return undefined explicitly.
Loading history...
4689
		},
4690
4691
		ID: function( elem, match ) {
4692
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
4693
		},
4694
4695
		TAG: function( elem, match ) {
4696
			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
4697
		},
4698
		
4699
		CLASS: function( elem, match ) {
4700
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
4701
				.indexOf( match ) > -1;
4702
		},
4703
4704
		ATTR: function( elem, match ) {
4705
			var name = match[1],
4706
				result = Sizzle.attr ?
4707
					Sizzle.attr( elem, name ) :
4708
					Expr.attrHandle[ name ] ?
4709
					Expr.attrHandle[ name ]( elem ) :
4710
					elem[ name ] != null ?
4711
						elem[ name ] :
4712
						elem.getAttribute( name ),
4713
				value = result + "",
4714
				type = match[2],
4715
				check = match[4];
4716
4717
			return result == null ?
4718
				type === "!=" :
4719
				!type && Sizzle.attr ?
4720
				result != null :
4721 View Code Duplication
				type === "=" ?
4722
				value === check :
4723
				type === "*=" ?
4724
				value.indexOf(check) >= 0 :
4725
				type === "~=" ?
4726
				(" " + value + " ").indexOf(check) >= 0 :
4727
				!check ?
4728
				value && result !== false :
4729
				type === "!=" ?
4730
				value !== check :
4731
				type === "^=" ?
4732
				value.indexOf(check) === 0 :
4733
				type === "$=" ?
4734
				value.substr(value.length - check.length) === check :
4735
				type === "|=" ?
4736
				value === check || value.substr(0, check.length + 1) === check + "-" :
4737
				false;
4738
		},
4739
4740
		POS: function( elem, match, i, array ) {
4741
			var name = match[2],
4742
				filter = Expr.setFilters[ name ];
4743
4744
			if ( filter ) {
4745
				return filter( elem, i, match, array );
4746
			}
4747
		}
4748
	}
4749
};
4750
4751
var origPOS = Expr.match.POS,
4752
	fescape = function(all, num){
4753
		return "\\" + (num - 0 + 1);
4754
	};
4755
4756
for ( var type in Expr.match ) {
4757
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4758
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4759
}
4760
4761
var makeArray = function( array, results ) {
4762
	array = Array.prototype.slice.call( array, 0 );
4763
4764
	if ( results ) {
4765
		results.push.apply( results, array );
4766
		return results;
4767
	}
4768
	
4769
	return array;
4770
};
4771
4772
// Perform a simple check to determine if the browser is capable of
4773
// converting a NodeList to an array using builtin methods.
4774
// Also verifies that the returned array holds DOM nodes
4775
// (which is not the case in the Blackberry browser)
4776
try {
4777
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
0 ignored issues
show
introduced by
The result of the property access to Array.prototype.slice.ca...ildNodes, 0).0.nodeType is not used.
Loading history...
4778
4779
// Provide a fallback method if it does not work
4780
} catch( e ) {
4781 View Code Duplication
	makeArray = function( array, results ) {
4782
		var i = 0,
4783
			ret = results || [];
4784
4785
		if ( toString.call(array) === "[object Array]" ) {
4786
			Array.prototype.push.apply( ret, array );
4787
4788
		} else {
4789
			if ( typeof array.length === "number" ) {
4790
				for ( var l = array.length; i < l; i++ ) {
4791
					ret.push( array[i] );
4792
				}
4793
4794
			} else {
4795
				for ( ; array[i]; i++ ) {
4796
					ret.push( array[i] );
4797
				}
4798
			}
4799
		}
4800
4801
		return ret;
4802
	};
4803
}
4804
4805
var sortOrder, siblingCheck;
4806
4807 View Code Duplication
if ( document.documentElement.compareDocumentPosition ) {
4808
	sortOrder = function( a, b ) {
4809
		if ( a === b ) {
4810
			hasDuplicate = true;
4811
			return 0;
4812
		}
4813
4814
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4815
			return a.compareDocumentPosition ? -1 : 1;
4816
		}
4817
4818
		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
4819
	};
4820
4821
} else {
4822
	sortOrder = function( a, b ) {
4823
		// The nodes are identical, we can exit early
4824
		if ( a === b ) {
4825
			hasDuplicate = true;
4826
			return 0;
4827
4828
		// Fallback to using sourceIndex (in IE) if it's available on both nodes
4829
		} else if ( a.sourceIndex && b.sourceIndex ) {
4830
			return a.sourceIndex - b.sourceIndex;
4831
		}
4832
4833
		var al, bl,
4834
			ap = [],
4835
			bp = [],
4836
			aup = a.parentNode,
4837
			bup = b.parentNode,
4838
			cur = aup;
4839
4840
		// If the nodes are siblings (or identical) we can do a quick check
4841
		if ( aup === bup ) {
4842
			return siblingCheck( a, b );
4843
4844
		// If no parents were found then the nodes are disconnected
4845
		} else if ( !aup ) {
4846
			return -1;
4847
4848
		} else if ( !bup ) {
4849
			return 1;
4850
		}
4851
4852
		// Otherwise they're somewhere else in the tree so we need
4853
		// to build up a full list of the parentNodes for comparison
4854
		while ( cur ) {
4855
			ap.unshift( cur );
4856
			cur = cur.parentNode;
4857
		}
4858
4859
		cur = bup;
4860
4861
		while ( cur ) {
4862
			bp.unshift( cur );
4863
			cur = cur.parentNode;
4864
		}
4865
4866
		al = ap.length;
4867
		bl = bp.length;
4868
4869
		// Start walking down the tree looking for a discrepancy
4870
		for ( var i = 0; i < al && i < bl; i++ ) {
4871
			if ( ap[i] !== bp[i] ) {
4872
				return siblingCheck( ap[i], bp[i] );
4873
			}
4874
		}
4875
4876
		// We ended someplace up the tree so do a sibling check
4877
		return i === al ?
4878
			siblingCheck( a, bp[i], -1 ) :
4879
			siblingCheck( ap[i], b, 1 );
4880
	};
4881
4882
	siblingCheck = function( a, b, ret ) {
4883
		if ( a === b ) {
4884
			return ret;
4885
		}
4886
4887
		var cur = a.nextSibling;
4888
4889
		while ( cur ) {
4890
			if ( cur === b ) {
4891
				return -1;
4892
			}
4893
4894
			cur = cur.nextSibling;
4895
		}
4896
4897
		return 1;
4898
	};
4899
}
4900
4901
// Check to see if the browser returns elements by name when
4902
// querying by getElementById (and provide a workaround)
4903 View Code Duplication
(function(){
4904
	// We're going to inject a fake input element with a specified name
4905
	var form = document.createElement("div"),
4906
		id = "script" + (new Date()).getTime(),
4907
		root = document.documentElement;
4908
4909
	form.innerHTML = "<a name='" + id + "'/>";
4910
4911
	// Inject it into the root element, check its status, and remove it quickly
4912
	root.insertBefore( form, root.firstChild );
4913
4914
	// The workaround has to do additional checks after a getElementById
4915
	// Which slows things down for other browsers (hence the branching)
4916
	if ( document.getElementById( id ) ) {
4917
		Expr.find.ID = function( match, context, isXML ) {
4918
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4919
				var m = context.getElementById(match[1]);
4920
4921
				return m ?
4922
					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4923
						[m] :
4924
						undefined :
4925
					[];
4926
			}
4927
		};
4928
4929
		Expr.filter.ID = function( elem, match ) {
4930
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4931
4932
			return elem.nodeType === 1 && node && node.nodeValue === match;
4933
		};
4934
	}
4935
4936
	root.removeChild( form );
4937
4938
	// release memory in IE
4939
	root = form = null;
4940
})();
4941
4942 View Code Duplication
(function(){
4943
	// Check to see if the browser returns only elements
4944
	// when doing getElementsByTagName("*")
4945
4946
	// Create a fake element
4947
	var div = document.createElement("div");
4948
	div.appendChild( document.createComment("") );
4949
4950
	// Make sure no comments are found
4951
	if ( div.getElementsByTagName("*").length > 0 ) {
4952
		Expr.find.TAG = function( match, context ) {
4953
			var results = context.getElementsByTagName( match[1] );
4954
4955
			// Filter out possible comments
4956
			if ( match[1] === "*" ) {
4957
				var tmp = [];
4958
4959
				for ( var i = 0; results[i]; i++ ) {
4960
					if ( results[i].nodeType === 1 ) {
4961
						tmp.push( results[i] );
4962
					}
4963
				}
4964
4965
				results = tmp;
4966
			}
4967
4968
			return results;
4969
		};
4970
	}
4971
4972
	// Check to see if an attribute returns normalized href attributes
4973
	div.innerHTML = "<a href='#'></a>";
4974
4975
	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4976
			div.firstChild.getAttribute("href") !== "#" ) {
4977
4978
		Expr.attrHandle.href = function( elem ) {
4979
			return elem.getAttribute( "href", 2 );
4980
		};
4981
	}
4982
4983
	// release memory in IE
4984
	div = null;
4985
})();
4986
4987 View Code Duplication
if ( document.querySelectorAll ) {
4988
	(function(){
4989
		var oldSizzle = Sizzle,
4990
			div = document.createElement("div"),
4991
			id = "__sizzle__";
4992
4993
		div.innerHTML = "<p class='TEST'></p>";
4994
4995
		// Safari can't handle uppercase or unicode characters when
4996
		// in quirks mode.
4997
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4998
			return;
4999
		}
5000
	
5001
		Sizzle = function( query, context, extra, seed ) {
5002
			context = context || document;
5003
5004
			// Only use querySelectorAll on non-XML documents
5005
			// (ID selectors don't work in non-HTML documents)
5006
			if ( !seed && !Sizzle.isXML(context) ) {
5007
				// See if we find a selector to speed up
5008
				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
5009
				
5010
				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
5011
					// Speed-up: Sizzle("TAG")
5012
					if ( match[1] ) {
5013
						return makeArray( context.getElementsByTagName( query ), extra );
5014
					
5015
					// Speed-up: Sizzle(".CLASS")
5016
					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
5017
						return makeArray( context.getElementsByClassName( match[2] ), extra );
5018
					}
5019
				}
5020
				
5021
				if ( context.nodeType === 9 ) {
5022
					// Speed-up: Sizzle("body")
5023
					// The body element only exists once, optimize finding it
5024
					if ( query === "body" && context.body ) {
5025
						return makeArray( [ context.body ], extra );
5026
						
5027
					// Speed-up: Sizzle("#ID")
5028
					} else if ( match && match[3] ) {
5029
						var elem = context.getElementById( match[3] );
5030
5031
						// Check parentNode to catch when Blackberry 4.6 returns
5032
						// nodes that are no longer in the document #6963
5033
						if ( elem && elem.parentNode ) {
5034
							// Handle the case where IE and Opera return items
5035
							// by name instead of ID
5036
							if ( elem.id === match[3] ) {
5037
								return makeArray( [ elem ], extra );
5038
							}
5039
							
5040
						} else {
5041
							return makeArray( [], extra );
5042
						}
5043
					}
5044
					
5045
					try {
5046
						return makeArray( context.querySelectorAll(query), extra );
5047
					} catch(qsaError) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
5048
5049
				// qSA works strangely on Element-rooted queries
5050
				// We can work around this by specifying an extra ID on the root
5051
				// and working up from there (Thanks to Andrew Dupont for the technique)
5052
				// IE 8 doesn't work on object elements
5053
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
5054
					var oldContext = context,
5055
						old = context.getAttribute( "id" ),
5056
						nid = old || id,
5057
						hasParent = context.parentNode,
5058
						relativeHierarchySelector = /^\s*[+~]/.test( query );
5059
5060
					if ( !old ) {
5061
						context.setAttribute( "id", nid );
5062
					} else {
5063
						nid = nid.replace( /'/g, "\\$&" );
5064
					}
5065
					if ( relativeHierarchySelector && hasParent ) {
5066
						context = context.parentNode;
5067
					}
5068
5069
					try {
5070
						if ( !relativeHierarchySelector || hasParent ) {
5071
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
5072
						}
5073
5074
					} catch(pseudoError) {
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
5075
					} finally {
5076
						if ( !old ) {
5077
							oldContext.removeAttribute( "id" );
5078
						}
5079
					}
5080
				}
5081
			}
5082
		
5083
			return oldSizzle(query, context, extra, seed);
5084
		};
5085
5086
		for ( var prop in oldSizzle ) {
5087
			Sizzle[ prop ] = oldSizzle[ prop ];
5088
		}
5089
5090
		// release memory in IE
5091
		div = null;
5092
	})();
5093
}
5094
5095
(function(){
5096
	var html = document.documentElement,
5097
		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
5098
5099
	if ( matches ) {
5100
		// Check to see if it's possible to do matchesSelector
5101
		// on a disconnected node (IE 9 fails this)
5102
		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
5103
			pseudoWorks = false;
5104
5105
		try {
5106
			// This should fail with an exception
5107
			// Gecko does not error, returns false instead
5108
			matches.call( document.documentElement, "[test!='']:sizzle" );
5109
	
5110
		} catch( pseudoError ) {
5111
			pseudoWorks = true;
5112
		}
5113
5114
		Sizzle.matchesSelector = function( node, expr ) {
5115
			// Make sure that attribute selectors are quoted
5116
			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
5117
5118
			if ( !Sizzle.isXML( node ) ) {
5119
				try { 
5120
					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
5121
						var ret = matches.call( node, expr );
5122
5123
						// IE 9's matchesSelector returns false on disconnected nodes
5124
						if ( ret || !disconnectedMatch ||
5125
								// As well, disconnected nodes are said to be in a document
5126
								// fragment in IE 9, so check for that
5127
								node.document && node.document.nodeType !== 11 ) {
5128
							return ret;
5129
						}
5130
					}
5131
				} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
5132
			}
5133
5134
			return Sizzle(expr, null, null, [node]).length > 0;
5135
		};
5136
	}
5137
})();
5138
5139 View Code Duplication
(function(){
5140
	var div = document.createElement("div");
5141
5142
	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
5143
5144
	// Opera can't find a second classname (in 9.6)
5145
	// Also, make sure that getElementsByClassName actually exists
5146
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
5147
		return;
5148
	}
5149
5150
	// Safari caches class attributes, doesn't catch changes (in 3.2)
5151
	div.lastChild.className = "e";
5152
5153
	if ( div.getElementsByClassName("e").length === 1 ) {
5154
		return;
5155
	}
5156
	
5157
	Expr.order.splice(1, 0, "CLASS");
5158
	Expr.find.CLASS = function( match, context, isXML ) {
5159
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5160
			return context.getElementsByClassName(match[1]);
5161
		}
5162
	};
5163
5164
	// release memory in IE
5165
	div = null;
5166
})();
5167
5168
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5169
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5170
		var elem = checkSet[i];
5171
5172
		if ( elem ) {
5173
			var match = false;
5174
5175
			elem = elem[dir];
5176
5177
			while ( elem ) {
5178
				if ( elem[ expando ] === doneName ) {
5179
					match = checkSet[elem.sizset];
5180
					break;
5181
				}
5182
5183
				if ( elem.nodeType === 1 && !isXML ){
5184
					elem[ expando ] = doneName;
5185
					elem.sizset = i;
5186
				}
5187
5188
				if ( elem.nodeName.toLowerCase() === cur ) {
5189
					match = elem;
5190
					break;
5191
				}
5192
5193
				elem = elem[dir];
5194
			}
5195
5196
			checkSet[i] = match;
5197
		}
5198
	}
5199
}
5200
5201
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5202
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5203
		var elem = checkSet[i];
5204
5205
		if ( elem ) {
5206
			var match = false;
5207
			
5208
			elem = elem[dir];
5209
5210
			while ( elem ) {
5211
				if ( elem[ expando ] === doneName ) {
5212
					match = checkSet[elem.sizset];
5213
					break;
5214
				}
5215
5216
				if ( elem.nodeType === 1 ) {
5217
					if ( !isXML ) {
5218
						elem[ expando ] = doneName;
5219
						elem.sizset = i;
5220
					}
5221
5222
					if ( typeof cur !== "string" ) {
5223
						if ( elem === cur ) {
5224
							match = true;
5225
							break;
5226
						}
5227
5228
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5229
						match = elem;
5230
						break;
5231
					}
5232
				}
5233
5234
				elem = elem[dir];
5235
			}
5236
5237
			checkSet[i] = match;
5238
		}
5239
	}
5240
}
5241
5242 View Code Duplication
if ( document.documentElement.contains ) {
5243
	Sizzle.contains = function( a, b ) {
5244
		return a !== b && (a.contains ? a.contains(b) : true);
5245
	};
5246
5247
} else if ( document.documentElement.compareDocumentPosition ) {
5248
	Sizzle.contains = function( a, b ) {
5249
		return !!(a.compareDocumentPosition(b) & 16);
5250
	};
5251
5252
} else {
5253
	Sizzle.contains = function() {
5254
		return false;
5255
	};
5256
}
5257
5258
Sizzle.isXML = function( elem ) {
5259
	// documentElement is verified for cases where it doesn't yet exist
5260
	// (such as loading iframes in IE - #4833) 
5261
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5262
5263
	return documentElement ? documentElement.nodeName !== "HTML" : false;
5264
};
5265
5266 View Code Duplication
var posProcess = function( selector, context, seed ) {
5267
	var match,
5268
		tmpSet = [],
5269
		later = "",
5270
		root = context.nodeType ? [context] : context;
5271
5272
	// Position selectors must be done after the filter
5273
	// And so must :not(positional) so we move all PSEUDOs to the end
5274
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5275
		later += match[0];
5276
		selector = selector.replace( Expr.match.PSEUDO, "" );
5277
	}
5278
5279
	selector = Expr.relative[selector] ? selector + "*" : selector;
5280
5281
	for ( var i = 0, l = root.length; i < l; i++ ) {
5282
		Sizzle( selector, root[i], tmpSet, seed );
5283
	}
5284
5285
	return Sizzle.filter( later, tmpSet );
5286
};
5287
5288
// EXPOSE
5289
// Override sizzle attribute retrieval
5290
Sizzle.attr = jQuery.attr;
5291
Sizzle.selectors.attrMap = {};
5292
jQuery.find = Sizzle;
5293
jQuery.expr = Sizzle.selectors;
5294
jQuery.expr[":"] = jQuery.expr.filters;
5295
jQuery.unique = Sizzle.uniqueSort;
5296
jQuery.text = Sizzle.getText;
5297
jQuery.isXMLDoc = Sizzle.isXML;
5298
jQuery.contains = Sizzle.contains;
5299
5300
5301
})();
5302
5303
5304
var runtil = /Until$/,
5305
	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5306
	// Note: This RegExp should be improved, or likely pulled from Sizzle
5307
	rmultiselector = /,/,
5308
	isSimple = /^.[^:#\[\.,]*$/,
5309
	slice = Array.prototype.slice,
5310
	POS = jQuery.expr.match.POS,
5311
	// methods guaranteed to produce a unique set when starting from a unique set
5312
	guaranteedUnique = {
5313
		children: true,
5314
		contents: true,
5315
		next: true,
5316
		prev: true
5317
	};
5318
5319
jQuery.fn.extend({
5320
	find: function( selector ) {
5321
		var self = this,
5322
			i, l;
5323
5324
		if ( typeof selector !== "string" ) {
5325
			return jQuery( selector ).filter(function() {
5326
				for ( i = 0, l = self.length; i < l; i++ ) {
0 ignored issues
show
Bug introduced by
The variable i is changed as part of the for loop for example by i++ on line 5326. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
5327
					if ( jQuery.contains( self[ i ], this ) ) {
5328
						return true;
5329
					}
5330
				}
5331
			});
5332
		}
5333
5334
		var ret = this.pushStack( "", "find", selector ),
5335
			length, n, r;
5336
5337 View Code Duplication
		for ( i = 0, l = this.length; i < l; i++ ) {
5338
			length = ret.length;
5339
			jQuery.find( selector, this[i], ret );
5340
5341
			if ( i > 0 ) {
5342
				// Make sure that the results are unique
5343
				for ( n = length; n < ret.length; n++ ) {
5344
					for ( r = 0; r < length; r++ ) {
5345
						if ( ret[r] === ret[n] ) {
5346
							ret.splice(n--, 1);
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable n here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
5347
							break;
5348
						}
5349
					}
5350
				}
5351
			}
5352
		}
5353
5354
		return ret;
5355
	},
5356
5357
	has: function( target ) {
5358
		var targets = jQuery( target );
5359
		return this.filter(function() {
5360
			for ( var i = 0, l = targets.length; i < l; i++ ) {
5361
				if ( jQuery.contains( this, targets[i] ) ) {
5362
					return true;
5363
				}
5364
			}
5365
		});
5366
	},
5367
5368
	not: function( selector ) {
5369
		return this.pushStack( winnow(this, selector, false), "not", selector);
5370
	},
5371
5372
	filter: function( selector ) {
5373
		return this.pushStack( winnow(this, selector, true), "filter", selector );
5374
	},
5375
5376
	is: function( selector ) {
5377
		return !!selector && ( 
5378
			typeof selector === "string" ?
5379
				// If this is a positional selector, check membership in the returned set
5380
				// so $("p:first").is("p:last") won't return true for a doc with two "p".
5381
				POS.test( selector ) ? 
5382
					jQuery( selector, this.context ).index( this[0] ) >= 0 :
5383
					jQuery.filter( selector, this ).length > 0 :
5384
				this.filter( selector ).length > 0 );
5385
	},
5386
5387
	closest: function( selectors, context ) {
5388
		var ret = [], i, l, cur = this[0];
5389
		
5390
		// Array (deprecated as of jQuery 1.7)
5391
		if ( jQuery.isArray( selectors ) ) {
5392
			var level = 1;
5393
5394
			while ( cur && cur.ownerDocument && cur !== context ) {
5395
				for ( i = 0; i < selectors.length; i++ ) {
5396
5397
					if ( jQuery( cur ).is( selectors[ i ] ) ) {
5398
						ret.push({ selector: selectors[ i ], elem: cur, level: level });
5399
					}
5400
				}
5401
5402
				cur = cur.parentNode;
5403
				level++;
5404
			}
5405
5406
			return ret;
5407
		}
5408
5409
		// String
5410
		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5411
				jQuery( selectors, context || this.context ) :
5412
				0;
5413
5414
		for ( i = 0, l = this.length; i < l; i++ ) {
5415
			cur = this[i];
5416
5417
			while ( cur ) {
5418
				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5419
					ret.push( cur );
5420
					break;
5421
5422
				} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
5423
					cur = cur.parentNode;
5424
					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5425
						break;
5426
					}
5427
				}
5428
			}
5429
		}
5430
5431
		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5432
5433
		return this.pushStack( ret, "closest", selectors );
5434
	},
5435
5436
	// Determine the position of an element within
5437
	// the matched set of elements
5438
	index: function( elem ) {
5439
5440
		// No argument, return index in parent
5441
		if ( !elem ) {
5442
			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
5443
		}
5444
5445
		// index in selector
5446
		if ( typeof elem === "string" ) {
5447
			return jQuery.inArray( this[0], jQuery( elem ) );
5448
		}
5449
5450
		// Locate the position of the desired element
5451
		return jQuery.inArray(
5452
			// If it receives a jQuery object, the first element is used
5453
			elem.jquery ? elem[0] : elem, this );
5454
	},
5455
5456
	add: function( selector, context ) {
5457
		var set = typeof selector === "string" ?
5458
				jQuery( selector, context ) :
5459
				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5460
			all = jQuery.merge( this.get(), set );
5461
5462
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5463
			all :
5464
			jQuery.unique( all ) );
5465
	},
5466
5467
	andSelf: function() {
5468
		return this.add( this.prevObject );
5469
	}
5470
});
5471
5472
// A painfully simple check to see if an element is disconnected
5473
// from a document (should be improved, where feasible).
5474
function isDisconnected( node ) {
5475
	return !node || !node.parentNode || node.parentNode.nodeType === 11;
5476
}
5477
5478
jQuery.each({
5479
	parent: function( elem ) {
5480
		var parent = elem.parentNode;
5481
		return parent && parent.nodeType !== 11 ? parent : null;
5482
	},
5483
	parents: function( elem ) {
5484
		return jQuery.dir( elem, "parentNode" );
5485
	},
5486
	parentsUntil: function( elem, i, until ) {
5487
		return jQuery.dir( elem, "parentNode", until );
5488
	},
5489
	next: function( elem ) {
5490
		return jQuery.nth( elem, 2, "nextSibling" );
5491
	},
5492
	prev: function( elem ) {
5493
		return jQuery.nth( elem, 2, "previousSibling" );
5494
	},
5495
	nextAll: function( elem ) {
5496
		return jQuery.dir( elem, "nextSibling" );
5497
	},
5498
	prevAll: function( elem ) {
5499
		return jQuery.dir( elem, "previousSibling" );
5500
	},
5501
	nextUntil: function( elem, i, until ) {
5502
		return jQuery.dir( elem, "nextSibling", until );
5503
	},
5504
	prevUntil: function( elem, i, until ) {
5505
		return jQuery.dir( elem, "previousSibling", until );
5506
	},
5507
	siblings: function( elem ) {
5508
		return jQuery.sibling( elem.parentNode.firstChild, elem );
5509
	},
5510
	children: function( elem ) {
5511
		return jQuery.sibling( elem.firstChild );
5512
	},
5513
	contents: function( elem ) {
5514
		return jQuery.nodeName( elem, "iframe" ) ?
5515
			elem.contentDocument || elem.contentWindow.document :
5516
			jQuery.makeArray( elem.childNodes );
5517
	}
5518 View Code Duplication
}, function( name, fn ) {
5519
	jQuery.fn[ name ] = function( until, selector ) {
5520
		var ret = jQuery.map( this, fn, until );
5521
5522
		if ( !runtil.test( name ) ) {
5523
			selector = until;
5524
		}
5525
5526
		if ( selector && typeof selector === "string" ) {
5527
			ret = jQuery.filter( selector, ret );
5528
		}
5529
5530
		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5531
5532
		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5533
			ret = ret.reverse();
5534
		}
5535
5536
		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
5537
	};
5538
});
5539
5540
jQuery.extend({
5541
	filter: function( expr, elems, not ) {
5542
		if ( not ) {
5543
			expr = ":not(" + expr + ")";
5544
		}
5545
5546
		return elems.length === 1 ?
5547
			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5548
			jQuery.find.matches(expr, elems);
5549
	},
5550
5551 View Code Duplication
	dir: function( elem, dir, until ) {
5552
		var matched = [],
5553
			cur = elem[ dir ];
5554
5555
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5556
			if ( cur.nodeType === 1 ) {
5557
				matched.push( cur );
5558
			}
5559
			cur = cur[dir];
5560
		}
5561
		return matched;
5562
	},
5563
5564
	nth: function( cur, result, dir, elem ) {
5565
		result = result || 1;
5566
		var num = 0;
5567
5568
		for ( ; cur; cur = cur[dir] ) {
5569
			if ( cur.nodeType === 1 && ++num === result ) {
5570
				break;
5571
			}
5572
		}
5573
5574
		return cur;
5575
	},
5576
5577
	sibling: function( n, elem ) {
5578
		var r = [];
5579
5580
		for ( ; n; n = n.nextSibling ) {
5581
			if ( n.nodeType === 1 && n !== elem ) {
5582
				r.push( n );
5583
			}
5584
		}
5585
5586
		return r;
5587
	}
5588
});
5589
5590
// Implement the identical functionality for filter and not
5591 View Code Duplication
function winnow( elements, qualifier, keep ) {
5592
5593
	// Can't pass null or undefined to indexOf in Firefox 4
5594
	// Set to 0 to skip string check
5595
	qualifier = qualifier || 0;
5596
5597
	if ( jQuery.isFunction( qualifier ) ) {
5598
		return jQuery.grep(elements, function( elem, i ) {
5599
			var retVal = !!qualifier.call( elem, i, elem );
5600
			return retVal === keep;
5601
		});
5602
5603
	} else if ( qualifier.nodeType ) {
5604
		return jQuery.grep(elements, function( elem, i ) {
5605
			return ( elem === qualifier ) === keep;
5606
		});
5607
5608
	} else if ( typeof qualifier === "string" ) {
5609
		var filtered = jQuery.grep(elements, function( elem ) {
5610
			return elem.nodeType === 1;
5611
		});
5612
5613
		if ( isSimple.test( qualifier ) ) {
5614
			return jQuery.filter(qualifier, filtered, !keep);
5615
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
5616
			qualifier = jQuery.filter( qualifier, filtered );
5617
		}
5618
	}
5619
5620
	return jQuery.grep(elements, function( elem, i ) {
5621
		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
5622
	});
5623
}
5624
5625
5626
5627
5628
function createSafeFragment( document ) {
5629
	var list = nodeNames.split( "|" ),
5630
	safeFrag = document.createDocumentFragment();
5631
5632
	if ( safeFrag.createElement ) {
5633
		while ( list.length ) {
5634
			safeFrag.createElement(
5635
				list.pop()
5636
			);
5637
		}
5638
	}
5639
	return safeFrag;
5640
}
5641
5642
var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
5643
		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5644
	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5645
	rleadingWhitespace = /^\s+/,
5646
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5647
	rtagName = /<([\w:]+)/,
5648
	rtbody = /<tbody/i,
5649
	rhtml = /<|&#?\w+;/,
5650
	rnoInnerhtml = /<(?:script|style)/i,
5651
	rnocache = /<(?:script|object|embed|option|style)/i,
5652
	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
5653
	// checked="checked" or checked
5654
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5655
	rscriptType = /\/(java|ecma)script/i,
5656
	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5657
	wrapMap = {
5658
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
5659
		legend: [ 1, "<fieldset>", "</fieldset>" ],
5660
		thead: [ 1, "<table>", "</table>" ],
5661
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5662
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5663
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5664
		area: [ 1, "<map>", "</map>" ],
5665
		_default: [ 0, "", "" ]
5666
	},
5667
	safeFragment = createSafeFragment( document );
5668
5669
wrapMap.optgroup = wrapMap.option;
5670
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5671
wrapMap.th = wrapMap.td;
5672
5673
// IE can't serialize <link> and <script> tags normally
5674
if ( !jQuery.support.htmlSerialize ) {
5675
	wrapMap._default = [ 1, "div<div>", "</div>" ];
5676
}
5677
5678
jQuery.fn.extend({
5679
	text: function( text ) {
5680
		if ( jQuery.isFunction(text) ) {
5681
			return this.each(function(i) {
5682
				var self = jQuery( this );
5683
5684
				self.text( text.call(this, i, self.text()) );
5685
			});
5686
		}
5687
5688
		if ( typeof text !== "object" && text !== undefined ) {
5689
			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5690
		}
5691
5692
		return jQuery.text( this );
5693
	},
5694
5695
	wrapAll: function( html ) {
5696
		if ( jQuery.isFunction( html ) ) {
5697
			return this.each(function(i) {
5698
				jQuery(this).wrapAll( html.call(this, i) );
5699
			});
5700
		}
5701
5702
		if ( this[0] ) {
5703
			// The elements to wrap the target around
5704
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5705
5706
			if ( this[0].parentNode ) {
5707
				wrap.insertBefore( this[0] );
5708
			}
5709
5710
			wrap.map(function() {
5711
				var elem = this;
5712
5713
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5714
					elem = elem.firstChild;
5715
				}
5716
5717
				return elem;
5718
			}).append( this );
5719
		}
5720
5721
		return this;
5722
	},
5723
5724
	wrapInner: function( html ) {
5725
		if ( jQuery.isFunction( html ) ) {
5726
			return this.each(function(i) {
5727
				jQuery(this).wrapInner( html.call(this, i) );
5728
			});
5729
		}
5730
5731
		return this.each(function() {
5732
			var self = jQuery( this ),
5733
				contents = self.contents();
5734
5735
			if ( contents.length ) {
5736
				contents.wrapAll( html );
5737
5738
			} else {
5739
				self.append( html );
5740
			}
5741
		});
5742
	},
5743
5744
	wrap: function( html ) {
5745
		var isFunction = jQuery.isFunction( html );
5746
5747
		return this.each(function(i) {
5748
			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
5749
		});
5750
	},
5751
5752
	unwrap: function() {
5753
		return this.parent().each(function() {
5754
			if ( !jQuery.nodeName( this, "body" ) ) {
5755
				jQuery( this ).replaceWith( this.childNodes );
5756
			}
5757
		}).end();
5758
	},
5759
5760
	append: function() {
5761
		return this.domManip(arguments, true, function( elem ) {
5762
			if ( this.nodeType === 1 ) {
5763
				this.appendChild( elem );
5764
			}
5765
		});
5766
	},
5767
5768
	prepend: function() {
5769
		return this.domManip(arguments, true, function( elem ) {
5770
			if ( this.nodeType === 1 ) {
5771
				this.insertBefore( elem, this.firstChild );
5772
			}
5773
		});
5774
	},
5775
5776
	before: function() {
5777
		if ( this[0] && this[0].parentNode ) {
5778
			return this.domManip(arguments, false, function( elem ) {
5779
				this.parentNode.insertBefore( elem, this );
5780
			});
5781
		} else if ( arguments.length ) {
5782
			var set = jQuery.clean( arguments );
5783
			set.push.apply( set, this.toArray() );
5784
			return this.pushStack( set, "before", arguments );
5785
		}
5786
	},
5787
5788
	after: function() {
5789
		if ( this[0] && this[0].parentNode ) {
5790
			return this.domManip(arguments, false, function( elem ) {
5791
				this.parentNode.insertBefore( elem, this.nextSibling );
5792
			});
5793
		} else if ( arguments.length ) {
5794
			var set = this.pushStack( this, "after", arguments );
5795
			set.push.apply( set, jQuery.clean(arguments) );
5796
			return set;
5797
		}
5798
	},
5799
5800
	// keepData is for internal use only--do not document
5801 View Code Duplication
	remove: function( selector, keepData ) {
5802
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5803
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5804
				if ( !keepData && elem.nodeType === 1 ) {
5805
					jQuery.cleanData( elem.getElementsByTagName("*") );
5806
					jQuery.cleanData( [ elem ] );
5807
				}
5808
5809
				if ( elem.parentNode ) {
5810
					elem.parentNode.removeChild( elem );
5811
				}
5812
			}
5813
		}
5814
5815
		return this;
5816
	},
5817
5818
	empty: function() {
5819
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5820
			// Remove element nodes and prevent memory leaks
5821
			if ( elem.nodeType === 1 ) {
5822
				jQuery.cleanData( elem.getElementsByTagName("*") );
5823
			}
5824
5825
			// Remove any remaining nodes
5826
			while ( elem.firstChild ) {
5827
				elem.removeChild( elem.firstChild );
5828
			}
5829
		}
5830
5831
		return this;
5832
	},
5833
5834
	clone: function( dataAndEvents, deepDataAndEvents ) {
5835
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5836
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5837
5838
		return this.map( function () {
5839
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5840
		});
5841
	},
5842
5843
	html: function( value ) {
5844
		if ( value === undefined ) {
5845
			return this[0] && this[0].nodeType === 1 ?
5846
				this[0].innerHTML.replace(rinlinejQuery, "") :
5847
				null;
5848
5849
		// See if we can take a shortcut and just use innerHTML
5850
		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5851
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5852
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5853
5854
			value = value.replace(rxhtmlTag, "<$1></$2>");
5855
5856
			try {
5857
				for ( var i = 0, l = this.length; i < l; i++ ) {
5858
					// Remove element nodes and prevent memory leaks
5859
					if ( this[i].nodeType === 1 ) {
5860
						jQuery.cleanData( this[i].getElementsByTagName("*") );
5861
						this[i].innerHTML = value;
5862
					}
5863
				}
5864
5865
			// If using innerHTML throws an exception, use the fallback method
5866
			} catch(e) {
5867
				this.empty().append( value );
5868
			}
5869
5870
		} else if ( jQuery.isFunction( value ) ) {
5871
			this.each(function(i){
5872
				var self = jQuery( this );
5873
5874
				self.html( value.call(this, i, self.html()) );
5875
			});
5876
5877
		} else {
5878
			this.empty().append( value );
5879
		}
5880
5881
		return this;
5882
	},
5883
5884 View Code Duplication
	replaceWith: function( value ) {
5885
		if ( this[0] && this[0].parentNode ) {
5886
			// Make sure that the elements are removed from the DOM before they are inserted
5887
			// this can help fix replacing a parent with child elements
5888
			if ( jQuery.isFunction( value ) ) {
5889
				return this.each(function(i) {
5890
					var self = jQuery(this), old = self.html();
5891
					self.replaceWith( value.call( this, i, old ) );
5892
				});
5893
			}
5894
5895
			if ( typeof value !== "string" ) {
5896
				value = jQuery( value ).detach();
5897
			}
5898
5899
			return this.each(function() {
5900
				var next = this.nextSibling,
5901
					parent = this.parentNode;
5902
5903
				jQuery( this ).remove();
5904
5905
				if ( next ) {
5906
					jQuery(next).before( value );
5907
				} else {
5908
					jQuery(parent).append( value );
5909
				}
5910
			});
5911
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
5912
			return this.length ?
5913
				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5914
				this;
5915
		}
5916
	},
5917
5918
	detach: function( selector ) {
5919
		return this.remove( selector, true );
5920
	},
5921
5922 View Code Duplication
	domManip: function( args, table, callback ) {
5923
		var results, first, fragment, parent,
5924
			value = args[0],
5925
			scripts = [];
5926
5927
		// We can't cloneNode fragments that contain checked, in WebKit
5928
		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5929
			return this.each(function() {
5930
				jQuery(this).domManip( args, table, callback, true );
5931
			});
5932
		}
5933
5934
		if ( jQuery.isFunction(value) ) {
5935
			return this.each(function(i) {
5936
				var self = jQuery(this);
5937
				args[0] = value.call(this, i, table ? self.html() : undefined);
5938
				self.domManip( args, table, callback );
5939
			});
5940
		}
5941
5942
		if ( this[0] ) {
5943
			parent = value && value.parentNode;
5944
5945
			// If we're in a fragment, just use that instead of building a new one
5946
			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5947
				results = { fragment: parent };
5948
5949
			} else {
5950
				results = jQuery.buildFragment( args, this, scripts );
5951
			}
5952
5953
			fragment = results.fragment;
5954
5955
			if ( fragment.childNodes.length === 1 ) {
5956
				first = fragment = fragment.firstChild;
5957
			} else {
5958
				first = fragment.firstChild;
5959
			}
5960
5961
			if ( first ) {
5962
				table = table && jQuery.nodeName( first, "tr" );
5963
5964
				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5965
					callback.call(
5966
						table ?
5967
							root(this[i], first) :
5968
							this[i],
5969
						// Make sure that we do not leak memory by inadvertently discarding
5970
						// the original fragment (which might have attached data) instead of
5971
						// using it; in addition, use the original fragment object for the last
5972
						// item instead of first because it can end up being emptied incorrectly
5973
						// in certain situations (Bug #8070).
5974
						// Fragments from the fragment cache must always be cloned and never used
5975
						// in place.
5976
						results.cacheable || ( l > 1 && i < lastIndex ) ?
5977
							jQuery.clone( fragment, true, true ) :
5978
							fragment
5979
					);
5980
				}
5981
			}
5982
5983
			if ( scripts.length ) {
5984
				jQuery.each( scripts, evalScript );
5985
			}
5986
		}
5987
5988
		return this;
5989
	}
5990
});
5991
5992
function root( elem, cur ) {
5993
	return jQuery.nodeName(elem, "table") ?
5994
		(elem.getElementsByTagName("tbody")[0] ||
5995
		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5996
		elem;
5997
}
5998
5999
function cloneCopyEvent( src, dest ) {
6000
6001
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6002
		return;
6003
	}
6004
6005
	var type, i, l,
6006
		oldData = jQuery._data( src ),
6007
		curData = jQuery._data( dest, oldData ),
6008
		events = oldData.events;
6009
6010
	if ( events ) {
6011
		delete curData.handle;
6012
		curData.events = {};
6013
6014
		for ( type in events ) {
6015
			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6016
				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
6017
			}
6018
		}
6019
	}
6020
6021
	// make the cloned public data object a copy from the original
6022
	if ( curData.data ) {
6023
		curData.data = jQuery.extend( {}, curData.data );
6024
	}
6025
}
6026
6027 View Code Duplication
function cloneFixAttributes( src, dest ) {
6028
	var nodeName;
6029
6030
	// We do not need to do anything for non-Elements
6031
	if ( dest.nodeType !== 1 ) {
6032
		return;
6033
	}
6034
6035
	// clearAttributes removes the attributes, which we don't want,
6036
	// but also removes the attachEvent events, which we *do* want
6037
	if ( dest.clearAttributes ) {
6038
		dest.clearAttributes();
6039
	}
6040
6041
	// mergeAttributes, in contrast, only merges back on the
6042
	// original attributes, not the events
6043
	if ( dest.mergeAttributes ) {
6044
		dest.mergeAttributes( src );
6045
	}
6046
6047
	nodeName = dest.nodeName.toLowerCase();
6048
6049
	// IE6-8 fail to clone children inside object elements that use
6050
	// the proprietary classid attribute value (rather than the type
6051
	// attribute) to identify the type of content to display
6052
	if ( nodeName === "object" ) {
6053
		dest.outerHTML = src.outerHTML;
6054
6055
	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
6056
		// IE6-8 fails to persist the checked state of a cloned checkbox
6057
		// or radio button. Worse, IE6-7 fail to give the cloned element
6058
		// a checked appearance if the defaultChecked value isn't also set
6059
		if ( src.checked ) {
6060
			dest.defaultChecked = dest.checked = src.checked;
6061
		}
6062
6063
		// IE6-7 get confused and end up setting the value of a cloned
6064
		// checkbox/radio button to an empty string instead of "on"
6065
		if ( dest.value !== src.value ) {
6066
			dest.value = src.value;
6067
		}
6068
6069
	// IE6-8 fails to return the selected option to the default selected
6070
	// state when cloning options
6071
	} else if ( nodeName === "option" ) {
6072
		dest.selected = src.defaultSelected;
6073
6074
	// IE6-8 fails to set the defaultValue to the correct value when
6075
	// cloning other types of input fields
6076
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
6077
		dest.defaultValue = src.defaultValue;
6078
	}
6079
6080
	// Event data gets referenced instead of copied if the expando
6081
	// gets copied too
6082
	dest.removeAttribute( jQuery.expando );
6083
}
6084
6085
jQuery.buildFragment = function( args, nodes, scripts ) {
6086
	var fragment, cacheable, cacheresults, doc,
6087
	first = args[ 0 ];
6088
6089
	// nodes may contain either an explicit document object,
6090
	// a jQuery collection or context object.
6091
	// If nodes[0] contains a valid object to assign to doc
6092
	if ( nodes && nodes[0] ) {
6093
		doc = nodes[0].ownerDocument || nodes[0];
6094
	}
6095
6096
	// Ensure that an attr object doesn't incorrectly stand in as a document object
6097
	// Chrome and Firefox seem to allow this to occur and will throw exception
6098
	// Fixes #8950
6099
	if ( !doc.createDocumentFragment ) {
0 ignored issues
show
Bug introduced by
The variable doc does not seem to be initialized in case nodes && nodes.0 on line 6092 is false. Are you sure this can never be the case?
Loading history...
6100
		doc = document;
6101
	}
6102
6103
	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6104
	// Cloning options loses the selected state, so don't cache them
6105
	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6106
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6107
	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
6108
	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
6109
		first.charAt(0) === "<" && !rnocache.test( first ) &&
6110
		(jQuery.support.checkClone || !rchecked.test( first )) &&
6111
		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
6112
6113
		cacheable = true;
6114
6115
		cacheresults = jQuery.fragments[ first ];
6116
		if ( cacheresults && cacheresults !== 1 ) {
6117
			fragment = cacheresults;
6118
		}
6119
	}
6120
6121
	if ( !fragment ) {
6122
		fragment = doc.createDocumentFragment();
6123
		jQuery.clean( args, doc, fragment, scripts );
6124
	}
6125
6126
	if ( cacheable ) {
6127
		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
6128
	}
6129
6130
	return { fragment: fragment, cacheable: cacheable };
0 ignored issues
show
Bug introduced by
The variable cacheable does not seem to be initialized in case args.length === 1 && typ...noshimcache.test(first) on line 6108 is false. Are you sure this can never be the case?
Loading history...
6131
};
6132
6133
jQuery.fragments = {};
6134
6135
jQuery.each({
6136
	appendTo: "append",
6137
	prependTo: "prepend",
6138
	insertBefore: "before",
6139
	insertAfter: "after",
6140
	replaceAll: "replaceWith"
6141 View Code Duplication
}, function( name, original ) {
6142
	jQuery.fn[ name ] = function( selector ) {
6143
		var ret = [],
6144
			insert = jQuery( selector ),
6145
			parent = this.length === 1 && this[0].parentNode;
6146
6147
		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
6148
			insert[ original ]( this[0] );
6149
			return this;
6150
6151
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
6152
			for ( var i = 0, l = insert.length; i < l; i++ ) {
6153
				var elems = ( i > 0 ? this.clone(true) : this ).get();
6154
				jQuery( insert[i] )[ original ]( elems );
6155
				ret = ret.concat( elems );
6156
			}
6157
6158
			return this.pushStack( ret, name, insert.selector );
6159
		}
6160
	};
6161
});
6162
6163
function getAll( elem ) {
6164
	if ( typeof elem.getElementsByTagName !== "undefined" ) {
6165
		return elem.getElementsByTagName( "*" );
6166
6167
	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
6168
		return elem.querySelectorAll( "*" );
6169
6170
	} else {
6171
		return [];
6172
	}
6173
}
6174
6175
// Used in clean, fixes the defaultChecked property
6176
function fixDefaultChecked( elem ) {
6177
	if ( elem.type === "checkbox" || elem.type === "radio" ) {
6178
		elem.defaultChecked = elem.checked;
6179
	}
6180
}
6181
// Finds all inputs and passes them to fixDefaultChecked
6182
function findInputs( elem ) {
6183
	var nodeName = ( elem.nodeName || "" ).toLowerCase();
6184
	if ( nodeName === "input" ) {
6185
		fixDefaultChecked( elem );
6186
	// Skip scripts, get other children
6187
	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
6188
		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6189
	}
6190
}
6191
6192
// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
6193
function shimCloneNode( elem ) {
6194
	var div = document.createElement( "div" );
6195
	safeFragment.appendChild( div );
6196
6197
	div.innerHTML = elem.outerHTML;
6198
	return div.firstChild;
6199
}
6200
6201
jQuery.extend({
6202
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6203
		var srcElements,
6204
			destElements,
6205
			i,
6206
			// IE<=8 does not properly clone detached, unknown element nodes
6207
			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
6208
				elem.cloneNode( true ) :
6209
				shimCloneNode( elem );
6210
6211
		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6212
				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6213
			// IE copies events bound via attachEvent when using cloneNode.
6214
			// Calling detachEvent on the clone will also remove the events
6215
			// from the original. In order to get around this, we use some
6216
			// proprietary methods to clear the events. Thanks to MooTools
6217
			// guys for this hotness.
6218
6219
			cloneFixAttributes( elem, clone );
6220
6221
			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
6222
			srcElements = getAll( elem );
6223
			destElements = getAll( clone );
6224
6225
			// Weird iteration because IE will replace the length property
6226
			// with an element if you are cloning the body and one of the
6227
			// elements on the page has a name or id of "length"
6228
			for ( i = 0; srcElements[i]; ++i ) {
6229
				// Ensure that the destination node is not null; Fixes #9587
6230
				if ( destElements[i] ) {
6231
					cloneFixAttributes( srcElements[i], destElements[i] );
6232
				}
6233
			}
6234
		}
6235
6236
		// Copy the events from the original to the clone
6237
		if ( dataAndEvents ) {
6238
			cloneCopyEvent( elem, clone );
6239
6240
			if ( deepDataAndEvents ) {
6241
				srcElements = getAll( elem );
6242
				destElements = getAll( clone );
6243
6244
				for ( i = 0; srcElements[i]; ++i ) {
6245
					cloneCopyEvent( srcElements[i], destElements[i] );
6246
				}
6247
			}
6248
		}
6249
6250
		srcElements = destElements = null;
6251
6252
		// Return the cloned set
6253
		return clone;
6254
	},
6255
6256 View Code Duplication
	clean: function( elems, context, fragment, scripts ) {
6257
		var checkScriptType;
6258
6259
		context = context || document;
6260
6261
		// !context.createElement fails in IE with an error but returns typeof 'object'
6262
		if ( typeof context.createElement === "undefined" ) {
6263
			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6264
		}
6265
6266
		var ret = [], j;
6267
6268
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6269
			if ( typeof elem === "number" ) {
6270
				elem += "";
6271
			}
6272
6273
			if ( !elem ) {
6274
				continue;
6275
			}
6276
6277
			// Convert html string into DOM nodes
6278
			if ( typeof elem === "string" ) {
6279
				if ( !rhtml.test( elem ) ) {
6280
					elem = context.createTextNode( elem );
6281
				} else {
6282
					// Fix "XHTML"-style tags in all browsers
6283
					elem = elem.replace(rxhtmlTag, "<$1></$2>");
6284
6285
					// Trim whitespace, otherwise indexOf won't work as expected
6286
					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
6287
						wrap = wrapMap[ tag ] || wrapMap._default,
6288
						depth = wrap[0],
6289
						div = context.createElement("div");
6290
6291
					// Append wrapper element to unknown element safe doc fragment
6292
					if ( context === document ) {
6293
						// Use the fragment we've already created for this document
6294
						safeFragment.appendChild( div );
6295
					} else {
6296
						// Use a fragment created with the owner document
6297
						createSafeFragment( context ).appendChild( div );
6298
					}
6299
6300
					// Go to html and back, then peel off extra wrappers
6301
					div.innerHTML = wrap[1] + elem + wrap[2];
6302
6303
					// Move to the right depth
6304
					while ( depth-- ) {
6305
						div = div.lastChild;
6306
					}
6307
6308
					// Remove IE's autoinserted <tbody> from table fragments
6309
					if ( !jQuery.support.tbody ) {
6310
6311
						// String was a <table>, *may* have spurious <tbody>
6312
						var hasBody = rtbody.test(elem),
6313
							tbody = tag === "table" && !hasBody ?
6314
								div.firstChild && div.firstChild.childNodes :
6315
6316
								// String was a bare <thead> or <tfoot>
6317
								wrap[1] === "<table>" && !hasBody ?
6318
									div.childNodes :
6319
									[];
6320
6321
						for ( j = tbody.length - 1; j >= 0 ; --j ) {
6322
							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6323
								tbody[ j ].parentNode.removeChild( tbody[ j ] );
6324
							}
6325
						}
6326
					}
6327
6328
					// IE completely kills leading whitespace when innerHTML is used
6329
					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6330
						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6331
					}
6332
6333
					elem = div.childNodes;
6334
				}
6335
			}
6336
6337
			// Resets defaultChecked for any radios and checkboxes
6338
			// about to be appended to the DOM in IE 6/7 (#8060)
6339
			var len;
6340
			if ( !jQuery.support.appendChecked ) {
6341
				if ( elem[0] && typeof (len = elem.length) === "number" ) {
6342
					for ( j = 0; j < len; j++ ) {
6343
						findInputs( elem[j] );
6344
					}
6345
				} else {
6346
					findInputs( elem );
6347
				}
6348
			}
6349
6350
			if ( elem.nodeType ) {
6351
				ret.push( elem );
6352
			} else {
6353
				ret = jQuery.merge( ret, elem );
6354
			}
6355
		}
6356
6357
		if ( fragment ) {
6358
			checkScriptType = function( elem ) {
6359
				return !elem.type || rscriptType.test( elem.type );
6360
			};
6361
			for ( i = 0; ret[i]; i++ ) {
6362
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6363
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6364
6365
				} else {
6366
					if ( ret[i].nodeType === 1 ) {
6367
						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6368
6369
						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6370
					}
6371
					fragment.appendChild( ret[i] );
6372
				}
6373
			}
6374
		}
6375
6376
		return ret;
6377
	},
6378
6379 View Code Duplication
	cleanData: function( elems ) {
6380
		var data, id,
6381
			cache = jQuery.cache,
6382
			special = jQuery.event.special,
6383
			deleteExpando = jQuery.support.deleteExpando;
6384
6385
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6386
			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6387
				continue;
6388
			}
6389
6390
			id = elem[ jQuery.expando ];
6391
6392
			if ( id ) {
6393
				data = cache[ id ];
6394
6395
				if ( data && data.events ) {
6396
					for ( var type in data.events ) {
6397
						if ( special[ type ] ) {
6398
							jQuery.event.remove( elem, type );
6399
6400
						// This is a shortcut to avoid jQuery.event.remove's overhead
6401
						} else {
6402
							jQuery.removeEvent( elem, type, data.handle );
6403
						}
6404
					}
6405
6406
					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
6407
					if ( data.handle ) {
6408
						data.handle.elem = null;
6409
					}
6410
				}
6411
6412
				if ( deleteExpando ) {
6413
					delete elem[ jQuery.expando ];
6414
6415
				} else if ( elem.removeAttribute ) {
6416
					elem.removeAttribute( jQuery.expando );
6417
				}
6418
6419
				delete cache[ id ];
6420
			}
6421
		}
6422
	}
6423
});
6424
6425
function evalScript( i, elem ) {
6426
	if ( elem.src ) {
6427
		jQuery.ajax({
6428
			url: elem.src,
6429
			async: false,
6430
			dataType: "script"
6431
		});
6432
	} else {
6433
		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
6434
	}
6435
6436
	if ( elem.parentNode ) {
6437
		elem.parentNode.removeChild( elem );
6438
	}
6439
}
6440
6441
6442
6443
6444
var ralpha = /alpha\([^)]*\)/i,
6445
	ropacity = /opacity=([^)]*)/,
6446
	// fixed for IE9, see #8346
6447
	rupper = /([A-Z]|^ms)/g,
6448
	rnumpx = /^-?\d+(?:px)?$/i,
6449
	rnum = /^-?\d/,
6450
	rrelNum = /^([\-+])=([\-+.\de]+)/,
6451
6452
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6453
	cssWidth = [ "Left", "Right" ],
6454
	cssHeight = [ "Top", "Bottom" ],
6455
	curCSS,
6456
6457
	getComputedStyle,
6458
	currentStyle;
6459
6460
jQuery.fn.css = function( name, value ) {
6461
	// Setting 'undefined' is a no-op
6462
	if ( arguments.length === 2 && value === undefined ) {
6463
		return this;
6464
	}
6465
6466
	return jQuery.access( this, name, value, true, function( elem, name, value ) {
6467
		return value !== undefined ?
6468
			jQuery.style( elem, name, value ) :
6469
			jQuery.css( elem, name );
6470
	});
6471
};
6472
6473
jQuery.extend({
6474
	// Add in style property hooks for overriding the default
6475
	// behavior of getting and setting a style property
6476
	cssHooks: {
6477
		opacity: {
6478
			get: function( elem, computed ) {
6479
				if ( computed ) {
6480
					// We should always get a number back from opacity
6481
					var ret = curCSS( elem, "opacity", "opacity" );
6482
					return ret === "" ? "1" : ret;
6483
6484
				} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
6485
					return elem.style.opacity;
6486
				}
6487
			}
6488
		}
6489
	},
6490
6491
	// Exclude the following css properties to add px
6492
	cssNumber: {
6493
		"fillOpacity": true,
6494
		"fontWeight": true,
6495
		"lineHeight": true,
6496
		"opacity": true,
6497
		"orphans": true,
6498
		"widows": true,
6499
		"zIndex": true,
6500
		"zoom": true
6501
	},
6502
6503
	// Add in properties whose names you wish to fix before
6504
	// setting or getting the value
6505
	cssProps: {
6506
		// normalize float css property
6507
		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6508
	},
6509
6510
	// Get and set the style property on a DOM Node
6511
	style: function( elem, name, value, extra ) {
6512
		// Don't set styles on text and comment nodes
6513
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6514
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
6515
		}
6516
6517
		// Make sure that we're working with the right name
6518
		var ret, type, origName = jQuery.camelCase( name ),
6519
			style = elem.style, hooks = jQuery.cssHooks[ origName ];
6520
6521
		name = jQuery.cssProps[ origName ] || origName;
6522
6523
		// Check if we're setting a value
6524
		if ( value !== undefined ) {
6525
			type = typeof value;
6526
6527
			// convert relative number strings (+= or -=) to relative numbers. #7345
6528
			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6529
				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
6530
				// Fixes bug #9237
6531
				type = "number";
6532
			}
6533
6534
			// Make sure that NaN and null values aren't set. See: #7116
6535
			if ( value == null || type === "number" && isNaN( value ) ) {
6536
				return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
6537
			}
6538
6539
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
6540
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6541
				value += "px";
6542
			}
6543
6544
			// If a hook was provided, use that value, otherwise just set the specified value
6545
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6546
				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6547
				// Fixes bug #5509
6548
				try {
6549
					style[ name ] = value;
6550
				} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
6551
			}
6552
6553
		} else {
6554
			// If a hook was provided get the non-computed value from there
6555
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6556
				return ret;
6557
			}
6558
6559
			// Otherwise just get the value from the style object
6560
			return style[ name ];
6561
		}
6562
	},
6563
6564
	css: function( elem, name, extra ) {
6565
		var ret, hooks;
6566
6567
		// Make sure that we're working with the right name
6568
		name = jQuery.camelCase( name );
6569
		hooks = jQuery.cssHooks[ name ];
6570
		name = jQuery.cssProps[ name ] || name;
6571
6572
		// cssFloat needs a special treatment
6573
		if ( name === "cssFloat" ) {
6574
			name = "float";
6575
		}
6576
6577
		// If a hook was provided get the computed value from there
6578
		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6579
			return ret;
6580
6581
		// Otherwise, if a way to get the computed value exists, use that
6582
		} else if ( curCSS ) {
6583
			return curCSS( elem, name );
6584
		}
6585
	},
6586
6587
	// A method for quickly swapping in/out CSS properties to get correct calculations
6588
	swap: function( elem, options, callback ) {
6589
		var old = {};
6590
6591
		// Remember the old values, and insert the new ones
6592
		for ( var name in options ) {
6593
			old[ name ] = elem.style[ name ];
6594
			elem.style[ name ] = options[ name ];
6595
		}
6596
6597
		callback.call( elem );
6598
6599
		// Revert the old values
6600
		for ( name in options ) {
6601
			elem.style[ name ] = old[ name ];
6602
		}
6603
	}
6604
});
6605
6606
// DEPRECATED, Use jQuery.css() instead
6607
jQuery.curCSS = jQuery.css;
6608
6609
jQuery.each(["height", "width"], function( i, name ) {
6610
	jQuery.cssHooks[ name ] = {
6611
		get: function( elem, computed, extra ) {
6612
			var val;
6613
6614
			if ( computed ) {
6615
				if ( elem.offsetWidth !== 0 ) {
6616
					return getWH( elem, name, extra );
6617
				} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
6618
					jQuery.swap( elem, cssShow, function() {
6619
						val = getWH( elem, name, extra );
6620
					});
6621
				}
6622
6623
				return val;
6624
			}
6625
		},
6626
6627
		set: function( elem, value ) {
6628
			if ( rnumpx.test( value ) ) {
6629
				// ignore negative width and height values #1599
6630
				value = parseFloat( value );
6631
6632
				if ( value >= 0 ) {
6633
					return value + "px";
6634
				}
6635
6636
			} else {
6637
				return value;
6638
			}
6639
		}
6640
	};
6641
});
6642
6643
if ( !jQuery.support.opacity ) {
6644
	jQuery.cssHooks.opacity = {
6645
		get: function( elem, computed ) {
6646
			// IE uses filters for opacity
6647
			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6648
				( parseFloat( RegExp.$1 ) / 100 ) + "" :
6649
				computed ? "1" : "";
6650
		},
6651
6652
		set: function( elem, value ) {
6653
			var style = elem.style,
6654
				currentStyle = elem.currentStyle,
6655
				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6656
				filter = currentStyle && currentStyle.filter || style.filter || "";
6657
6658
			// IE has trouble with opacity if it does not have layout
6659
			// Force it by setting the zoom level
6660
			style.zoom = 1;
6661
6662
			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6663
			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
6664
6665
				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6666
				// if "filter:" is present at all, clearType is disabled, we want to avoid this
6667
				// style.removeAttribute is IE Only, but so apparently is this code path...
6668
				style.removeAttribute( "filter" );
6669
6670
				// if there there is no filter style applied in a css rule, we are done
6671
				if ( currentStyle && !currentStyle.filter ) {
6672
					return;
6673
				}
6674
			}
6675
6676
			// otherwise, set new filter values
6677
			style.filter = ralpha.test( filter ) ?
6678
				filter.replace( ralpha, opacity ) :
6679
				filter + " " + opacity;
6680
		}
6681
	};
6682
}
6683
6684
jQuery(function() {
6685
	// This hook cannot be added until DOM ready because the support test
6686
	// for it is not run until after DOM ready
6687
	if ( !jQuery.support.reliableMarginRight ) {
6688
		jQuery.cssHooks.marginRight = {
6689
			get: function( elem, computed ) {
6690
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6691
				// Work around by temporarily setting element display to inline-block
6692
				var ret;
6693
				jQuery.swap( elem, { "display": "inline-block" }, function() {
6694
					if ( computed ) {
6695
						ret = curCSS( elem, "margin-right", "marginRight" );
6696
					} else {
6697
						ret = elem.style.marginRight;
6698
					}
6699
				});
6700
				return ret;
6701
			}
6702
		};
6703
	}
6704
});
6705
6706 View Code Duplication
if ( document.defaultView && document.defaultView.getComputedStyle ) {
6707
	getComputedStyle = function( elem, name ) {
6708
		var ret, defaultView, computedStyle;
6709
6710
		name = name.replace( rupper, "-$1" ).toLowerCase();
6711
6712
		if ( (defaultView = elem.ownerDocument.defaultView) &&
6713
				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6714
			ret = computedStyle.getPropertyValue( name );
6715
			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6716
				ret = jQuery.style( elem, name );
6717
			}
6718
		}
6719
6720
		return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case defaultView = elem.owner...mputedStyle(elem, null) on line 6712 is false. Are you sure this can never be the case?
Loading history...
6721
	};
6722
}
6723
6724 View Code Duplication
if ( document.documentElement.currentStyle ) {
6725
	currentStyle = function( elem, name ) {
6726
		var left, rsLeft, uncomputed,
6727
			ret = elem.currentStyle && elem.currentStyle[ name ],
6728
			style = elem.style;
6729
6730
		// Avoid setting ret to empty string here
6731
		// so we don't default to auto
6732
		if ( ret === null && style && (uncomputed = style[ name ]) ) {
6733
			ret = uncomputed;
6734
		}
6735
6736
		// From the awesome hack by Dean Edwards
6737
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6738
6739
		// If we're not dealing with a regular pixel number
6740
		// but a number that has a weird ending, we need to convert it to pixels
6741
		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
6742
6743
			// Remember the original values
6744
			left = style.left;
6745
			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
6746
6747
			// Put in the new values to get a computed value out
6748
			if ( rsLeft ) {
6749
				elem.runtimeStyle.left = elem.currentStyle.left;
6750
			}
6751
			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
6752
			ret = style.pixelLeft + "px";
6753
6754
			// Revert the changed values
6755
			style.left = left;
6756
			if ( rsLeft ) {
6757
				elem.runtimeStyle.left = rsLeft;
6758
			}
6759
		}
6760
6761
		return ret === "" ? "auto" : ret;
6762
	};
6763
}
6764
6765
curCSS = getComputedStyle || currentStyle;
6766
6767
function getWH( elem, name, extra ) {
6768
6769
	// Start with offset property
6770
	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6771
		which = name === "width" ? cssWidth : cssHeight,
6772
		i = 0,
6773
		len = which.length;
6774
6775 View Code Duplication
	if ( val > 0 ) {
6776
		if ( extra !== "border" ) {
6777
			for ( ; i < len; i++ ) {
6778
				if ( !extra ) {
6779
					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
6780
				}
6781
				if ( extra === "margin" ) {
6782
					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
6783
				} else {
6784
					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
6785
				}
6786
			}
6787
		}
6788
6789
		return val + "px";
6790
	}
6791
6792
	// Fall back to computed then uncomputed css if necessary
6793
	val = curCSS( elem, name, name );
6794
	if ( val < 0 || val == null ) {
6795
		val = elem.style[ name ] || 0;
6796
	}
6797
	// Normalize "", auto, and prepare for extra
6798
	val = parseFloat( val ) || 0;
6799
6800
	// Add padding, border, margin
6801 View Code Duplication
	if ( extra ) {
6802
		for ( ; i < len; i++ ) {
6803
			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
6804
			if ( extra !== "padding" ) {
6805
				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
6806
			}
6807
			if ( extra === "margin" ) {
6808
				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
6809
			}
6810
		}
6811
	}
6812
6813
	return val + "px";
6814
}
6815
6816 View Code Duplication
if ( jQuery.expr && jQuery.expr.filters ) {
6817
	jQuery.expr.filters.hidden = function( elem ) {
6818
		var width = elem.offsetWidth,
6819
			height = elem.offsetHeight;
6820
6821
		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
6822
	};
6823
6824
	jQuery.expr.filters.visible = function( elem ) {
6825
		return !jQuery.expr.filters.hidden( elem );
6826
	};
6827
}
6828
6829
6830
6831
6832
var r20 = /%20/g,
6833
	rbracket = /\[\]$/,
6834
	rCRLF = /\r?\n/g,
6835
	rhash = /#.*$/,
6836
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6837
	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6838
	// #7653, #8125, #8152: local protocol detection
6839
	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
6840
	rnoContent = /^(?:GET|HEAD)$/,
6841
	rprotocol = /^\/\//,
6842
	rquery = /\?/,
6843
	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6844
	rselectTextarea = /^(?:select|textarea)/i,
6845
	rspacesAjax = /\s+/,
6846
	rts = /([?&])_=[^&]*/,
6847
	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6848
6849
	// Keep a copy of the old load method
6850
	_load = jQuery.fn.load,
6851
6852
	/* Prefilters
6853
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6854
	 * 2) These are called:
6855
	 *    - BEFORE asking for a transport
6856
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
6857
	 * 3) key is the dataType
6858
	 * 4) the catchall symbol "*" can be used
6859
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6860
	 */
6861
	prefilters = {},
6862
6863
	/* Transports bindings
6864
	 * 1) key is the dataType
6865
	 * 2) the catchall symbol "*" can be used
6866
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
6867
	 */
6868
	transports = {},
6869
6870
	// Document location
6871
	ajaxLocation,
6872
6873
	// Document location segments
6874
	ajaxLocParts,
6875
6876
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
6877
	allTypes = ["*/"] + ["*"];
6878
6879
// #8138, IE may throw an exception when accessing
6880
// a field from window.location if document.domain has been set
6881
try {
6882
	ajaxLocation = location.href;
6883
} catch( e ) {
6884
	// Use the href attribute of an A element
6885
	// since IE will modify it given document.location
6886
	ajaxLocation = document.createElement( "a" );
6887
	ajaxLocation.href = "";
6888
	ajaxLocation = ajaxLocation.href;
6889
}
6890
6891
// Segment location into parts
6892
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
6893
6894
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6895 View Code Duplication
function addToPrefiltersOrTransports( structure ) {
6896
6897
	// dataTypeExpression is optional and defaults to "*"
6898
	return function( dataTypeExpression, func ) {
6899
6900
		if ( typeof dataTypeExpression !== "string" ) {
6901
			func = dataTypeExpression;
6902
			dataTypeExpression = "*";
6903
		}
6904
6905
		if ( jQuery.isFunction( func ) ) {
6906
			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6907
				i = 0,
6908
				length = dataTypes.length,
6909
				dataType,
6910
				list,
6911
				placeBefore;
6912
6913
			// For each dataType in the dataTypeExpression
6914
			for ( ; i < length; i++ ) {
6915
				dataType = dataTypes[ i ];
6916
				// We control if we're asked to add before
6917
				// any existing element
6918
				placeBefore = /^\+/.test( dataType );
6919
				if ( placeBefore ) {
6920
					dataType = dataType.substr( 1 ) || "*";
6921
				}
6922
				list = structure[ dataType ] = structure[ dataType ] || [];
6923
				// then we add to the structure accordingly
6924
				list[ placeBefore ? "unshift" : "push" ]( func );
6925
			}
6926
		}
6927
	};
6928
}
6929
6930
// Base inspection function for prefilters and transports
6931 View Code Duplication
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6932
		dataType /* internal */, inspected /* internal */ ) {
6933
6934
	dataType = dataType || options.dataTypes[ 0 ];
6935
	inspected = inspected || {};
6936
6937
	inspected[ dataType ] = true;
6938
6939
	var list = structure[ dataType ],
6940
		i = 0,
6941
		length = list ? list.length : 0,
6942
		executeOnly = ( structure === prefilters ),
6943
		selection;
6944
6945
	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
6946
		selection = list[ i ]( options, originalOptions, jqXHR );
6947
		// If we got redirected to another dataType
6948
		// we try there if executing only and not done already
6949
		if ( typeof selection === "string" ) {
6950
			if ( !executeOnly || inspected[ selection ] ) {
6951
				selection = undefined;
6952
			} else {
6953
				options.dataTypes.unshift( selection );
6954
				selection = inspectPrefiltersOrTransports(
6955
						structure, options, originalOptions, jqXHR, selection, inspected );
6956
			}
6957
		}
6958
	}
6959
	// If we're only executing or nothing was selected
6960
	// we try the catchall dataType if not done already
6961
	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6962
		selection = inspectPrefiltersOrTransports(
6963
				structure, options, originalOptions, jqXHR, "*", inspected );
6964
	}
6965
	// unnecessary when only executing (prefilters)
6966
	// but it'll be ignored by the caller in that case
6967
	return selection;
6968
}
6969
6970
// A special extend for ajax options
6971
// that takes "flat" options (not to be deep extended)
6972
// Fixes #9887
6973
function ajaxExtend( target, src ) {
6974
	var key, deep,
6975
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
6976
	for ( key in src ) {
6977
		if ( src[ key ] !== undefined ) {
6978
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
6979
		}
6980
	}
6981
	if ( deep ) {
6982
		jQuery.extend( true, target, deep );
6983
	}
6984
}
6985
6986
jQuery.fn.extend({
6987 View Code Duplication
	load: function( url, params, callback ) {
6988
		if ( typeof url !== "string" && _load ) {
6989
			return _load.apply( this, arguments );
6990
6991
		// Don't do a request if no elements are being requested
6992
		} else if ( !this.length ) {
6993
			return this;
6994
		}
6995
6996
		var off = url.indexOf( " " );
6997
		if ( off >= 0 ) {
6998
			var selector = url.slice( off, url.length );
6999
			url = url.slice( 0, off );
7000
		}
7001
7002
		// Default to a GET request
7003
		var type = "GET";
7004
7005
		// If the second parameter was provided
7006
		if ( params ) {
7007
			// If it's a function
7008
			if ( jQuery.isFunction( params ) ) {
7009
				// We assume that it's the callback
7010
				callback = params;
7011
				params = undefined;
7012
7013
			// Otherwise, build a param string
7014
			} else if ( typeof params === "object" ) {
7015
				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
7016
				type = "POST";
7017
			}
7018
		}
7019
7020
		var self = this;
7021
7022
		// Request the remote document
7023
		jQuery.ajax({
7024
			url: url,
7025
			type: type,
7026
			dataType: "html",
7027
			data: params,
7028
			// Complete callback (responseText is used internally)
7029
			complete: function( jqXHR, status, responseText ) {
7030
				// Store the response as specified by the jqXHR object
7031
				responseText = jqXHR.responseText;
7032
				// If successful, inject the HTML into all the matched elements
7033
				if ( jqXHR.isResolved() ) {
7034
					// #4825: Get the actual response in case
7035
					// a dataFilter is present in ajaxSettings
7036
					jqXHR.done(function( r ) {
7037
						responseText = r;
7038
					});
7039
					// See if a selector was specified
7040
					self.html( selector ?
7041
						// Create a dummy div to hold the results
7042
						jQuery("<div>")
7043
							// inject the contents of the document in, removing the scripts
7044
							// to avoid any 'Permission Denied' errors in IE
7045
							.append(responseText.replace(rscript, ""))
7046
7047
							// Locate the specified elements
7048
							.find(selector) :
7049
7050
						// If not, just inject the full result
7051
						responseText );
7052
				}
7053
7054
				if ( callback ) {
7055
					self.each( callback, [ responseText, status, jqXHR ] );
7056
				}
7057
			}
7058
		});
7059
7060
		return this;
7061
	},
7062
7063
	serialize: function() {
7064
		return jQuery.param( this.serializeArray() );
7065
	},
7066
7067 View Code Duplication
	serializeArray: function() {
7068
		return this.map(function(){
7069
			return this.elements ? jQuery.makeArray( this.elements ) : this;
7070
		})
7071
		.filter(function(){
7072
			return this.name && !this.disabled &&
7073
				( this.checked || rselectTextarea.test( this.nodeName ) ||
7074
					rinput.test( this.type ) );
7075
		})
7076
		.map(function( i, elem ){
7077
			var val = jQuery( this ).val();
7078
7079
			return val == null ?
7080
				null :
7081
				jQuery.isArray( val ) ?
7082
					jQuery.map( val, function( val, i ){
7083
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7084
					}) :
7085
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7086
		}).get();
7087
	}
7088
});
7089
7090
// Attach a bunch of functions for handling common AJAX events
7091
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7092
	jQuery.fn[ o ] = function( f ){
7093
		return this.on( o, f );
7094
	};
7095
});
7096
7097
jQuery.each( [ "get", "post" ], function( i, method ) {
7098
	jQuery[ method ] = function( url, data, callback, type ) {
7099
		// shift arguments if data argument was omitted
7100
		if ( jQuery.isFunction( data ) ) {
7101
			type = type || callback;
7102
			callback = data;
7103
			data = undefined;
7104
		}
7105
7106
		return jQuery.ajax({
7107
			type: method,
7108
			url: url,
7109
			data: data,
7110
			success: callback,
7111
			dataType: type
7112
		});
7113
	};
7114
});
7115
7116
jQuery.extend({
7117
7118
	getScript: function( url, callback ) {
7119
		return jQuery.get( url, undefined, callback, "script" );
7120
	},
7121
7122
	getJSON: function( url, data, callback ) {
7123
		return jQuery.get( url, data, callback, "json" );
7124
	},
7125
7126
	// Creates a full fledged settings object into target
7127
	// with both ajaxSettings and settings fields.
7128
	// If target is omitted, writes into ajaxSettings.
7129
	ajaxSetup: function( target, settings ) {
7130
		if ( settings ) {
7131
			// Building a settings object
7132
			ajaxExtend( target, jQuery.ajaxSettings );
7133
		} else {
7134
			// Extending ajaxSettings
7135
			settings = target;
7136
			target = jQuery.ajaxSettings;
7137
		}
7138
		ajaxExtend( target, settings );
7139
		return target;
7140
	},
7141
7142
	ajaxSettings: {
7143
		url: ajaxLocation,
7144
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7145
		global: true,
7146
		type: "GET",
7147
		contentType: "application/x-www-form-urlencoded",
7148
		processData: true,
7149
		async: true,
7150
		/*
7151
		timeout: 0,
7152
		data: null,
7153
		dataType: null,
7154
		username: null,
7155
		password: null,
7156
		cache: null,
7157
		traditional: false,
7158
		headers: {},
7159
		*/
7160
7161
		accepts: {
7162
			xml: "application/xml, text/xml",
7163
			html: "text/html",
7164
			text: "text/plain",
7165
			json: "application/json, text/javascript",
7166
			"*": allTypes
7167
		},
7168
7169
		contents: {
7170
			xml: /xml/,
7171
			html: /html/,
7172
			json: /json/
7173
		},
7174
7175
		responseFields: {
7176
			xml: "responseXML",
7177
			text: "responseText"
7178
		},
7179
7180
		// List of data converters
7181
		// 1) key format is "source_type destination_type" (a single space in-between)
7182
		// 2) the catchall symbol "*" can be used for source_type
7183
		converters: {
7184
7185
			// Convert anything to text
7186
			"* text": window.String,
7187
7188
			// Text to html (true = no transformation)
7189
			"text html": true,
7190
7191
			// Evaluate text as a json expression
7192
			"text json": jQuery.parseJSON,
7193
7194
			// Parse text as xml
7195
			"text xml": jQuery.parseXML
7196
		},
7197
7198
		// For options that shouldn't be deep extended:
7199
		// you can add your own custom options here if
7200
		// and when you create one that shouldn't be
7201
		// deep extended (see ajaxExtend)
7202
		flatOptions: {
7203
			context: true,
7204
			url: true
7205
		}
7206
	},
7207
7208
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7209
	ajaxTransport: addToPrefiltersOrTransports( transports ),
7210
7211
	// Main method
7212 View Code Duplication
	ajax: function( url, options ) {
7213
7214
		// If url is an object, simulate pre-1.5 signature
7215
		if ( typeof url === "object" ) {
7216
			options = url;
7217
			url = undefined;
7218
		}
7219
7220
		// Force options to be an object
7221
		options = options || {};
7222
7223
		var // Create the final options object
7224
			s = jQuery.ajaxSetup( {}, options ),
7225
			// Callbacks context
7226
			callbackContext = s.context || s,
7227
			// Context for global events
7228
			// It's the callbackContext if one was provided in the options
7229
			// and if it's a DOM node or a jQuery collection
7230
			globalEventContext = callbackContext !== s &&
7231
				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7232
						jQuery( callbackContext ) : jQuery.event,
7233
			// Deferreds
7234
			deferred = jQuery.Deferred(),
7235
			completeDeferred = jQuery.Callbacks( "once memory" ),
7236
			// Status-dependent callbacks
7237
			statusCode = s.statusCode || {},
7238
			// ifModified key
7239
			ifModifiedKey,
7240
			// Headers (they are sent all at once)
7241
			requestHeaders = {},
7242
			requestHeadersNames = {},
7243
			// Response headers
7244
			responseHeadersString,
7245
			responseHeaders,
7246
			// transport
7247
			transport,
7248
			// timeout handle
7249
			timeoutTimer,
7250
			// Cross-domain detection vars
7251
			parts,
7252
			// The jqXHR state
7253
			state = 0,
7254
			// To know if global events are to be dispatched
7255
			fireGlobals,
7256
			// Loop variable
7257
			i,
7258
			// Fake xhr
7259
			jqXHR = {
7260
7261
				readyState: 0,
7262
7263
				// Caches the header
7264
				setRequestHeader: function( name, value ) {
7265
					if ( !state ) {
7266
						var lname = name.toLowerCase();
7267
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7268
						requestHeaders[ name ] = value;
7269
					}
7270
					return this;
7271
				},
7272
7273
				// Raw string
7274
				getAllResponseHeaders: function() {
7275
					return state === 2 ? responseHeadersString : null;
7276
				},
7277
7278
				// Builds headers hashtable if needed
7279
				getResponseHeader: function( key ) {
7280
					var match;
7281
					if ( state === 2 ) {
7282
						if ( !responseHeaders ) {
7283
							responseHeaders = {};
7284
							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7285
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7286
							}
7287
						}
7288
						match = responseHeaders[ key.toLowerCase() ];
7289
					}
7290
					return match === undefined ? null : match;
0 ignored issues
show
Bug introduced by
The variable match does not seem to be initialized in case state === 2 on line 7281 is false. Are you sure this can never be the case?
Loading history...
7291
				},
7292
7293
				// Overrides response content-type header
7294
				overrideMimeType: function( type ) {
7295
					if ( !state ) {
7296
						s.mimeType = type;
7297
					}
7298
					return this;
7299
				},
7300
7301
				// Cancel the request
7302
				abort: function( statusText ) {
7303
					statusText = statusText || "abort";
7304
					if ( transport ) {
7305
						transport.abort( statusText );
7306
					}
7307
					done( 0, statusText );
7308
					return this;
7309
				}
7310
			};
7311
7312
		// Callback for when everything is done
7313
		// It is defined here because jslint complains if it is declared
7314
		// at the end of the function (which would be more logical and readable)
7315
		function done( status, nativeStatusText, responses, headers ) {
7316
7317
			// Called once
7318
			if ( state === 2 ) {
7319
				return;
7320
			}
7321
7322
			// State is "done" now
7323
			state = 2;
7324
7325
			// Clear timeout if it exists
7326
			if ( timeoutTimer ) {
7327
				clearTimeout( timeoutTimer );
7328
			}
7329
7330
			// Dereference transport for early garbage collection
7331
			// (no matter how long the jqXHR object will be used)
7332
			transport = undefined;
7333
7334
			// Cache response headers
7335
			responseHeadersString = headers || "";
7336
7337
			// Set readyState
7338
			jqXHR.readyState = status > 0 ? 4 : 0;
7339
7340
			var isSuccess,
7341
				success,
7342
				error,
7343
				statusText = nativeStatusText,
7344
				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7345
				lastModified,
7346
				etag;
7347
7348
			// If successful, handle type chaining
7349
			if ( status >= 200 && status < 300 || status === 304 ) {
7350
7351
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7352
				if ( s.ifModified ) {
7353
7354
					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7355
						jQuery.lastModified[ ifModifiedKey ] = lastModified;
0 ignored issues
show
Bug introduced by
The variable ifModifiedKey does not seem to be initialized in case !s.hasContent on line 7493 is false. Are you sure this can never be the case?
Loading history...
7356
					}
7357
					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7358
						jQuery.etag[ ifModifiedKey ] = etag;
7359
					}
7360
				}
7361
7362
				// If not modified
7363
				if ( status === 304 ) {
7364
7365
					statusText = "notmodified";
7366
					isSuccess = true;
7367
7368
				// If we have data
7369
				} else {
7370
7371
					try {
7372
						success = ajaxConvert( s, response );
7373
						statusText = "success";
7374
						isSuccess = true;
7375
					} catch(e) {
7376
						// We have a parsererror
7377
						statusText = "parsererror";
7378
						error = e;
7379
					}
7380
				}
7381
			} else {
7382
				// We extract error from statusText
7383
				// then normalize statusText and status for non-aborts
7384
				error = statusText;
7385
				if ( !statusText || status ) {
7386
					statusText = "error";
7387
					if ( status < 0 ) {
7388
						status = 0;
7389
					}
7390
				}
7391
			}
7392
7393
			// Set data for the fake xhr object
7394
			jqXHR.status = status;
7395
			jqXHR.statusText = "" + ( nativeStatusText || statusText );
7396
7397
			// Success/Error
7398
			if ( isSuccess ) {
7399
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7400
			} else {
7401
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7402
			}
7403
7404
			// Status-dependent callbacks
7405
			jqXHR.statusCode( statusCode );
7406
			statusCode = undefined;
7407
7408
			if ( fireGlobals ) {
7409
				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7410
						[ jqXHR, s, isSuccess ? success : error ] );
7411
			}
7412
7413
			// Complete
7414
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
7415
7416
			if ( fireGlobals ) {
7417
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
7418
				// Handle the global AJAX counter
7419
				if ( !( --jQuery.active ) ) {
7420
					jQuery.event.trigger( "ajaxStop" );
7421
				}
7422
			}
7423
		}
7424
7425
		// Attach deferreds
7426
		deferred.promise( jqXHR );
7427
		jqXHR.success = jqXHR.done;
7428
		jqXHR.error = jqXHR.fail;
7429
		jqXHR.complete = completeDeferred.add;
7430
7431
		// Status-dependent callbacks
7432
		jqXHR.statusCode = function( map ) {
7433
			if ( map ) {
7434
				var tmp;
7435
				if ( state < 2 ) {
7436
					for ( tmp in map ) {
7437
						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7438
					}
7439
				} else {
7440
					tmp = map[ jqXHR.status ];
7441
					jqXHR.then( tmp, tmp );
7442
				}
7443
			}
7444
			return this;
7445
		};
7446
7447
		// Remove hash character (#7531: and string promotion)
7448
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7449
		// We also use the url parameter if available
7450
		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7451
7452
		// Extract dataTypes list
7453
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7454
7455
		// Determine if a cross-domain request is in order
7456
		if ( s.crossDomain == null ) {
7457
			parts = rurl.exec( s.url.toLowerCase() );
7458
			s.crossDomain = !!( parts &&
7459
				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7460
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7461
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7462
			);
7463
		}
7464
7465
		// Convert data if not already a string
7466
		if ( s.data && s.processData && typeof s.data !== "string" ) {
7467
			s.data = jQuery.param( s.data, s.traditional );
7468
		}
7469
7470
		// Apply prefilters
7471
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7472
7473
		// If request was aborted inside a prefiler, stop there
7474
		if ( state === 2 ) {
7475
			return false;
7476
		}
7477
7478
		// We can fire global events as of now if asked to
7479
		fireGlobals = s.global;
7480
7481
		// Uppercase the type
7482
		s.type = s.type.toUpperCase();
7483
7484
		// Determine if request has content
7485
		s.hasContent = !rnoContent.test( s.type );
7486
7487
		// Watch for a new set of requests
7488
		if ( fireGlobals && jQuery.active++ === 0 ) {
7489
			jQuery.event.trigger( "ajaxStart" );
7490
		}
7491
7492
		// More options handling for requests with no content
7493
		if ( !s.hasContent ) {
7494
7495
			// If data is available, append data to url
7496
			if ( s.data ) {
7497
				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7498
				// #9682: remove data so that it's not used in an eventual retry
7499
				delete s.data;
7500
			}
7501
7502
			// Get ifModifiedKey before adding the anti-cache parameter
7503
			ifModifiedKey = s.url;
7504
7505
			// Add anti-cache in url if needed
7506
			if ( s.cache === false ) {
7507
7508
				var ts = jQuery.now(),
7509
					// try replacing _= if it is there
7510
					ret = s.url.replace( rts, "$1_=" + ts );
7511
7512
				// if nothing was replaced, add timestamp to the end
7513
				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7514
			}
7515
		}
7516
7517
		// Set the correct header, if data is being sent
7518
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7519
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
7520
		}
7521
7522
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7523
		if ( s.ifModified ) {
7524
			ifModifiedKey = ifModifiedKey || s.url;
7525
			if ( jQuery.lastModified[ ifModifiedKey ] ) {
7526
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7527
			}
7528
			if ( jQuery.etag[ ifModifiedKey ] ) {
7529
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7530
			}
7531
		}
7532
7533
		// Set the Accepts header for the server, depending on the dataType
7534
		jqXHR.setRequestHeader(
7535
			"Accept",
7536
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7537
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
7538
				s.accepts[ "*" ]
7539
		);
7540
7541
		// Check for headers option
7542
		for ( i in s.headers ) {
7543
			jqXHR.setRequestHeader( i, s.headers[ i ] );
7544
		}
7545
7546
		// Allow custom headers/mimetypes and early abort
7547
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7548
				// Abort if not done already
7549
				jqXHR.abort();
7550
				return false;
7551
7552
		}
7553
7554
		// Install callbacks on deferreds
7555
		for ( i in { success: 1, error: 1, complete: 1 } ) {
7556
			jqXHR[ i ]( s[ i ] );
7557
		}
7558
7559
		// Get transport
7560
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7561
7562
		// If no transport, we auto-abort
7563
		if ( !transport ) {
7564
			done( -1, "No Transport" );
7565
		} else {
7566
			jqXHR.readyState = 1;
7567
			// Send global event
7568
			if ( fireGlobals ) {
7569
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7570
			}
7571
			// Timeout
7572
			if ( s.async && s.timeout > 0 ) {
7573
				timeoutTimer = setTimeout( function(){
7574
					jqXHR.abort( "timeout" );
7575
				}, s.timeout );
7576
			}
7577
7578
			try {
7579
				state = 1;
7580
				transport.send( requestHeaders, done );
7581
			} catch (e) {
7582
				// Propagate exception as error if not done
7583
				if ( state < 2 ) {
7584
					done( -1, e );
7585
				// Simply rethrow otherwise
7586
				} else {
7587
					throw e;
7588
				}
7589
			}
7590
		}
7591
7592
		return jqXHR;
7593
	},
7594
7595
	// Serialize an array of form elements or a set of
7596
	// key/values into a query string
7597 View Code Duplication
	param: function( a, traditional ) {
7598
		var s = [],
7599
			add = function( key, value ) {
7600
				// If value is a function, invoke it and return its value
7601
				value = jQuery.isFunction( value ) ? value() : value;
7602
				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7603
			};
7604
7605
		// Set traditional to true for jQuery <= 1.3.2 behavior.
7606
		if ( traditional === undefined ) {
7607
			traditional = jQuery.ajaxSettings.traditional;
7608
		}
7609
7610
		// If an array was passed in, assume that it is an array of form elements.
7611
		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7612
			// Serialize the form elements
7613
			jQuery.each( a, function() {
7614
				add( this.name, this.value );
7615
			});
7616
7617
		} else {
7618
			// If traditional, encode the "old" way (the way 1.3.2 or older
7619
			// did it), otherwise encode params recursively.
7620
			for ( var prefix in a ) {
7621
				buildParams( prefix, a[ prefix ], traditional, add );
7622
			}
7623
		}
7624
7625
		// Return the resulting serialization
7626
		return s.join( "&" ).replace( r20, "+" );
7627
	}
7628
});
7629
7630
function buildParams( prefix, obj, traditional, add ) {
7631
	if ( jQuery.isArray( obj ) ) {
7632
		// Serialize array item.
7633
		jQuery.each( obj, function( i, v ) {
7634
			if ( traditional || rbracket.test( prefix ) ) {
7635
				// Treat each array item as a scalar.
7636
				add( prefix, v );
7637
7638
			} else {
7639
				// If array item is non-scalar (array or object), encode its
7640
				// numeric index to resolve deserialization ambiguity issues.
7641
				// Note that rack (as of 1.0.0) can't currently deserialize
7642
				// nested arrays properly, and attempting to do so may cause
7643
				// a server error. Possible fixes are to modify rack's
7644
				// deserialization algorithm or to provide an option or flag
7645
				// to force array serialization to be shallow.
7646
				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
7647
			}
7648
		});
7649
7650
	} else if ( !traditional && obj != null && typeof obj === "object" ) {
7651
		// Serialize object item.
7652
		for ( var name in obj ) {
7653
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7654
		}
7655
7656
	} else {
7657
		// Serialize scalar item.
7658
		add( prefix, obj );
7659
	}
7660
}
7661
7662
// This is still on the jQuery object... for now
7663
// Want to move this to jQuery.ajax some day
7664
jQuery.extend({
7665
7666
	// Counter for holding the number of active queries
7667
	active: 0,
7668
7669
	// Last-Modified header cache for next request
7670
	lastModified: {},
7671
	etag: {}
7672
7673
});
7674
7675
/* Handles responses to an ajax request:
7676
 * - sets all responseXXX fields accordingly
7677
 * - finds the right dataType (mediates between content-type and expected dataType)
7678
 * - returns the corresponding response
7679
 */
7680
function ajaxHandleResponses( s, jqXHR, responses ) {
7681
7682
	var contents = s.contents,
7683
		dataTypes = s.dataTypes,
7684
		responseFields = s.responseFields,
7685
		ct,
7686
		type,
7687
		finalDataType,
7688
		firstDataType;
7689
7690
	// Fill responseXXX fields
7691
	for ( type in responseFields ) {
7692
		if ( type in responses ) {
7693
			jqXHR[ responseFields[type] ] = responses[ type ];
7694
		}
7695
	}
7696
7697
	// Remove auto dataType and get content-type in the process
7698
	while( dataTypes[ 0 ] === "*" ) {
7699
		dataTypes.shift();
7700
		if ( ct === undefined ) {
7701
			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7702
		}
7703
	}
7704
7705
	// Check if we're dealing with a known content-type
7706
	if ( ct ) {
7707
		for ( type in contents ) {
7708
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
7709
				dataTypes.unshift( type );
7710
				break;
7711
			}
7712
		}
7713
	}
7714
7715
	// Check to see if we have a response for the expected dataType
7716 View Code Duplication
	if ( dataTypes[ 0 ] in responses ) {
7717
		finalDataType = dataTypes[ 0 ];
7718
	} else {
7719
		// Try convertible dataTypes
7720
		for ( type in responses ) {
7721
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7722
				finalDataType = type;
7723
				break;
7724
			}
7725
			if ( !firstDataType ) {
7726
				firstDataType = type;
7727
			}
7728
		}
7729
		// Or just use first one
7730
		finalDataType = finalDataType || firstDataType;
7731
	}
7732
7733
	// If we found a dataType
7734
	// We add the dataType to the list if needed
7735
	// and return the corresponding response
7736
	if ( finalDataType ) {
7737
		if ( finalDataType !== dataTypes[ 0 ] ) {
7738
			dataTypes.unshift( finalDataType );
7739
		}
7740
		return responses[ finalDataType ];
7741
	}
7742
}
7743
7744
// Chain conversions given the request and the original response
7745 View Code Duplication
function ajaxConvert( s, response ) {
7746
7747
	// Apply the dataFilter if provided
7748
	if ( s.dataFilter ) {
7749
		response = s.dataFilter( response, s.dataType );
7750
	}
7751
7752
	var dataTypes = s.dataTypes,
7753
		converters = {},
7754
		i,
7755
		key,
7756
		length = dataTypes.length,
7757
		tmp,
7758
		// Current and previous dataTypes
7759
		current = dataTypes[ 0 ],
7760
		prev,
7761
		// Conversion expression
7762
		conversion,
7763
		// Conversion function
7764
		conv,
7765
		// Conversion functions (transitive conversion)
7766
		conv1,
7767
		conv2;
7768
7769
	// For each dataType in the chain
7770
	for ( i = 1; i < length; i++ ) {
7771
7772
		// Create converters map
7773
		// with lowercased keys
7774
		if ( i === 1 ) {
7775
			for ( key in s.converters ) {
7776
				if ( typeof key === "string" ) {
7777
					converters[ key.toLowerCase() ] = s.converters[ key ];
7778
				}
7779
			}
7780
		}
7781
7782
		// Get the dataTypes
7783
		prev = current;
7784
		current = dataTypes[ i ];
7785
7786
		// If current is auto dataType, update it to prev
7787
		if ( current === "*" ) {
7788
			current = prev;
7789
		// If no auto and dataTypes are actually different
7790
		} else if ( prev !== "*" && prev !== current ) {
7791
7792
			// Get the converter
7793
			conversion = prev + " " + current;
7794
			conv = converters[ conversion ] || converters[ "* " + current ];
7795
7796
			// If there is no direct converter, search transitively
7797
			if ( !conv ) {
7798
				conv2 = undefined;
7799
				for ( conv1 in converters ) {
7800
					tmp = conv1.split( " " );
7801
					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7802
						conv2 = converters[ tmp[1] + " " + current ];
7803
						if ( conv2 ) {
7804
							conv1 = converters[ conv1 ];
7805
							if ( conv1 === true ) {
7806
								conv = conv2;
7807
							} else if ( conv2 === true ) {
7808
								conv = conv1;
7809
							}
7810
							break;
7811
						}
7812
					}
7813
				}
7814
			}
7815
			// If we found no converter, dispatch an error
7816
			if ( !( conv || conv2 ) ) {
7817
				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7818
			}
7819
			// If found converter is not an equivalence
7820
			if ( conv !== true ) {
7821
				// Convert with 1 or 2 converters accordingly
7822
				response = conv ? conv( response ) : conv2( conv1(response) );
7823
			}
7824
		}
7825
	}
7826
	return response;
7827
}
7828
7829
7830
7831
7832
var jsc = jQuery.now(),
7833
	jsre = /(\=)\?(&|$)|\?\?/i;
7834
7835
// Default jsonp settings
7836
jQuery.ajaxSetup({
7837
	jsonp: "callback",
7838
	jsonpCallback: function() {
7839
		return jQuery.expando + "_" + ( jsc++ );
7840
	}
7841
});
7842
7843
// Detect, normalize options and install callbacks for jsonp requests
7844
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7845
7846
	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
7847
		( typeof s.data === "string" );
7848
7849
	if ( s.dataTypes[ 0 ] === "jsonp" ||
7850
		s.jsonp !== false && ( jsre.test( s.url ) ||
7851
				inspectData && jsre.test( s.data ) ) ) {
7852
7853
		var responseContainer,
7854
			jsonpCallback = s.jsonpCallback =
7855
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7856
			previous = window[ jsonpCallback ],
7857
			url = s.url,
7858
			data = s.data,
7859
			replace = "$1" + jsonpCallback + "$2";
7860
7861
		if ( s.jsonp !== false ) {
7862
			url = url.replace( jsre, replace );
7863
			if ( s.url === url ) {
7864
				if ( inspectData ) {
7865
					data = data.replace( jsre, replace );
7866
				}
7867
				if ( s.data === data ) {
7868
					// Add callback manually
7869
					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7870
				}
7871
			}
7872
		}
7873
7874
		s.url = url;
7875
		s.data = data;
7876
7877
		// Install callback
7878
		window[ jsonpCallback ] = function( response ) {
7879
			responseContainer = [ response ];
7880
		};
7881
7882
		// Clean-up function
7883
		jqXHR.always(function() {
7884
			// Set callback back to previous value
7885
			window[ jsonpCallback ] = previous;
7886
			// Call if it was a function and we have a response
7887
			if ( responseContainer && jQuery.isFunction( previous ) ) {
7888
				window[ jsonpCallback ]( responseContainer[ 0 ] );
7889
			}
7890
		});
7891
7892
		// Use data converter to retrieve json after script execution
7893
		s.converters["script json"] = function() {
7894
			if ( !responseContainer ) {
7895
				jQuery.error( jsonpCallback + " was not called" );
7896
			}
7897
			return responseContainer[ 0 ];
7898
		};
7899
7900
		// force json dataType
7901
		s.dataTypes[ 0 ] = "json";
7902
7903
		// Delegate to script
7904
		return "script";
7905
	}
7906
});
7907
7908
7909
7910
7911
// Install script dataType
7912
jQuery.ajaxSetup({
7913
	accepts: {
7914
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7915
	},
7916
	contents: {
7917
		script: /javascript|ecmascript/
7918
	},
7919
	converters: {
7920
		"text script": function( text ) {
7921
			jQuery.globalEval( text );
7922
			return text;
7923
		}
7924
	}
7925
});
7926
7927
// Handle cache's special case and global
7928
jQuery.ajaxPrefilter( "script", function( s ) {
7929
	if ( s.cache === undefined ) {
7930
		s.cache = false;
7931
	}
7932
	if ( s.crossDomain ) {
7933
		s.type = "GET";
7934
		s.global = false;
7935
	}
7936
});
7937
7938
// Bind script tag hack transport
7939 View Code Duplication
jQuery.ajaxTransport( "script", function(s) {
7940
7941
	// This transport only deals with cross domain requests
7942
	if ( s.crossDomain ) {
7943
7944
		var script,
7945
			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
7946
7947
		return {
7948
7949
			send: function( _, callback ) {
7950
7951
				script = document.createElement( "script" );
7952
7953
				script.async = "async";
7954
7955
				if ( s.scriptCharset ) {
7956
					script.charset = s.scriptCharset;
7957
				}
7958
7959
				script.src = s.url;
7960
7961
				// Attach handlers for all browsers
7962
				script.onload = script.onreadystatechange = function( _, isAbort ) {
7963
7964
					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7965
7966
						// Handle memory leak in IE
7967
						script.onload = script.onreadystatechange = null;
7968
7969
						// Remove the script
7970
						if ( head && script.parentNode ) {
7971
							head.removeChild( script );
7972
						}
7973
7974
						// Dereference the script
7975
						script = undefined;
7976
7977
						// Callback if not abort
7978
						if ( !isAbort ) {
7979
							callback( 200, "success" );
7980
						}
7981
					}
7982
				};
7983
				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7984
				// This arises when a base node is used (#2709 and #4378).
7985
				head.insertBefore( script, head.firstChild );
7986
			},
7987
7988
			abort: function() {
7989
				if ( script ) {
7990
					script.onload( 0, 1 );
7991
				}
7992
			}
7993
		};
7994
	}
7995
});
7996
7997
7998
7999
8000
var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8001
	xhrOnUnloadAbort = window.ActiveXObject ? function() {
8002
		// Abort all pending requests
8003
		for ( var key in xhrCallbacks ) {
8004
			xhrCallbacks[ key ]( 0, 1 );
8005
		}
8006
	} : false,
8007
	xhrId = 0,
8008
	xhrCallbacks;
8009
8010
// Functions to create xhrs
8011
function createStandardXHR() {
8012
	try {
8013
		return new window.XMLHttpRequest();
8014
	} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8015
}
8016
8017
function createActiveXHR() {
8018
	try {
8019
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8020
	} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8021
}
8022
8023
// Create the request object
8024
// (This is still attached to ajaxSettings for backward compatibility)
8025
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8026
	/* Microsoft failed to properly
8027
	 * implement the XMLHttpRequest in IE7 (can't request local files),
8028
	 * so we use the ActiveXObject when it is available
8029
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8030
	 * we need a fallback.
8031
	 */
8032
	function() {
8033
		return !this.isLocal && createStandardXHR() || createActiveXHR();
8034
	} :
8035
	// For all other browsers, use the standard XMLHttpRequest object
8036
	createStandardXHR;
8037
8038
// Determine support properties
8039
(function( xhr ) {
8040
	jQuery.extend( jQuery.support, {
8041
		ajax: !!xhr,
8042
		cors: !!xhr && ( "withCredentials" in xhr )
8043
	});
8044
})( jQuery.ajaxSettings.xhr() );
8045
8046
// Create transport if the browser can provide an xhr
8047
if ( jQuery.support.ajax ) {
8048
8049
	jQuery.ajaxTransport(function( s ) {
8050
		// Cross domain only allowed if supported through XMLHttpRequest
8051
		if ( !s.crossDomain || jQuery.support.cors ) {
8052
8053
			var callback;
8054
8055
			return {
8056
				send: function( headers, complete ) {
8057
8058
					// Get a new xhr
8059
					var xhr = s.xhr(),
8060
						handle,
8061
						i;
8062
8063
					// Open the socket
8064
					// Passing null username, generates a login popup on Opera (#2865)
8065
					if ( s.username ) {
8066
						xhr.open( s.type, s.url, s.async, s.username, s.password );
8067
					} else {
8068
						xhr.open( s.type, s.url, s.async );
8069
					}
8070
8071
					// Apply custom fields if provided
8072
					if ( s.xhrFields ) {
8073
						for ( i in s.xhrFields ) {
8074
							xhr[ i ] = s.xhrFields[ i ];
8075
						}
8076
					}
8077
8078
					// Override mime type if needed
8079
					if ( s.mimeType && xhr.overrideMimeType ) {
8080
						xhr.overrideMimeType( s.mimeType );
8081
					}
8082
8083
					// X-Requested-With header
8084
					// For cross-domain requests, seeing as conditions for a preflight are
8085
					// akin to a jigsaw puzzle, we simply never set it to be sure.
8086
					// (it can always be set on a per-request basis or even using ajaxSetup)
8087
					// For same-domain requests, won't change header if already provided.
8088
					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8089
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
8090
					}
8091
8092
					// Need an extra try/catch for cross domain requests in Firefox 3
8093
					try {
8094
						for ( i in headers ) {
8095
							xhr.setRequestHeader( i, headers[ i ] );
8096
						}
8097
					} catch( _ ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8098
8099
					// Do send the request
8100
					// This may raise an exception which is actually
8101
					// handled in jQuery.ajax (so no try/catch here)
8102
					xhr.send( ( s.hasContent && s.data ) || null );
8103
8104
					// Listener
8105
					callback = function( _, isAbort ) {
8106
8107
						var status,
8108
							statusText,
8109
							responseHeaders,
8110
							responses,
8111
							xml;
8112
8113
						// Firefox throws exceptions when accessing properties
8114
						// of an xhr when a network error occured
8115
						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8116
						try {
8117
8118
							// Was never called and is aborted or complete
8119
							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8120
8121
								// Only called once
8122
								callback = undefined;
8123
8124
								// Do not keep as active anymore
8125
								if ( handle ) {
8126
									xhr.onreadystatechange = jQuery.noop;
8127
									if ( xhrOnUnloadAbort ) {
8128
										delete xhrCallbacks[ handle ];
8129
									}
8130
								}
8131
8132
								// If it's an abort
8133
								if ( isAbort ) {
8134
									// Abort it manually if needed
8135
									if ( xhr.readyState !== 4 ) {
8136
										xhr.abort();
8137
									}
8138
								} else {
8139
									status = xhr.status;
8140
									responseHeaders = xhr.getAllResponseHeaders();
8141
									responses = {};
8142
									xml = xhr.responseXML;
8143
8144
									// Construct response list
8145
									if ( xml && xml.documentElement /* #4958 */ ) {
8146
										responses.xml = xml;
8147
									}
8148
									responses.text = xhr.responseText;
8149
8150
									// Firefox throws an exception when accessing
8151
									// statusText for faulty cross-domain requests
8152
									try {
8153
										statusText = xhr.statusText;
8154
									} catch( e ) {
8155
										// We normalize with Webkit giving an empty statusText
8156
										statusText = "";
8157
									}
8158
8159
									// Filter status for non standard behaviors
8160
8161
									// If the request is local and we have data: assume a success
8162
									// (success with no data won't get notified, that's the best we
8163
									// can do given current implementations)
8164
									if ( !status && s.isLocal && !s.crossDomain ) {
8165
										status = responses.text ? 200 : 404;
8166
									// IE - #1450: sometimes returns 1223 when it should be 204
8167
									} else if ( status === 1223 ) {
8168
										status = 204;
8169
									}
8170
								}
8171
							}
8172
						} catch( firefoxAccessException ) {
8173
							if ( !isAbort ) {
8174
								complete( -1, firefoxAccessException );
8175
							}
8176
						}
8177
8178
						// Call complete if needed
8179
						if ( responses ) {
8180
							complete( status, statusText, responses, responseHeaders );
0 ignored issues
show
Bug introduced by
The variable statusText seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
Bug introduced by
The variable status seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
Bug introduced by
The variable responseHeaders seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
8181
						}
8182
					};
8183
8184
					// if we're in sync mode or it's in cache
8185
					// and has been retrieved directly (IE6 & IE7)
8186
					// we need to manually fire the callback
8187
					if ( !s.async || xhr.readyState === 4 ) {
8188
						callback();
8189
					} else {
8190
						handle = ++xhrId;
8191
						if ( xhrOnUnloadAbort ) {
8192
							// Create the active xhrs callbacks list if needed
8193
							// and attach the unload handler
8194
							if ( !xhrCallbacks ) {
8195
								xhrCallbacks = {};
8196
								jQuery( window ).unload( xhrOnUnloadAbort );
8197
							}
8198
							// Add to list of active xhrs callbacks
8199
							xhrCallbacks[ handle ] = callback;
8200
						}
8201
						xhr.onreadystatechange = callback;
8202
					}
8203
				},
8204
8205
				abort: function() {
8206
					if ( callback ) {
8207
						callback(0,1);
8208
					}
8209
				}
8210
			};
8211
		}
8212
	});
8213
}
8214
8215
8216
8217
8218
var elemdisplay = {},
8219
	iframe, iframeDoc,
8220
	rfxtypes = /^(?:toggle|show|hide)$/,
8221
	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
8222
	timerId,
8223
	fxAttrs = [
8224
		// height animations
8225
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
8226
		// width animations
8227
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
8228
		// opacity animations
8229
		[ "opacity" ]
8230
	],
8231
	fxNow;
8232
8233
jQuery.fn.extend({
8234 View Code Duplication
	show: function( speed, easing, callback ) {
8235
		var elem, display;
8236
8237
		if ( speed || speed === 0 ) {
8238
			return this.animate( genFx("show", 3), speed, easing, callback );
8239
8240
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
8241
			for ( var i = 0, j = this.length; i < j; i++ ) {
8242
				elem = this[ i ];
8243
8244
				if ( elem.style ) {
8245
					display = elem.style.display;
8246
8247
					// Reset the inline display of this element to learn if it is
8248
					// being hidden by cascaded rules or not
8249
					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8250
						display = elem.style.display = "";
8251
					}
8252
8253
					// Set elements which have been overridden with display: none
8254
					// in a stylesheet to whatever the default browser style is
8255
					// for such an element
8256
					if ( display === "" && jQuery.css(elem, "display") === "none" ) {
8257
						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
8258
					}
8259
				}
8260
			}
8261
8262
			// Set the display of most of the elements in a second loop
8263
			// to avoid the constant reflow
8264
			for ( i = 0; i < j; i++ ) {
8265
				elem = this[ i ];
8266
8267
				if ( elem.style ) {
8268
					display = elem.style.display;
8269
8270
					if ( display === "" || display === "none" ) {
8271
						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
8272
					}
8273
				}
8274
			}
8275
8276
			return this;
8277
		}
8278
	},
8279
8280 View Code Duplication
	hide: function( speed, easing, callback ) {
8281
		if ( speed || speed === 0 ) {
8282
			return this.animate( genFx("hide", 3), speed, easing, callback);
8283
8284
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
8285
			var elem, display,
8286
				i = 0,
8287
				j = this.length;
8288
8289
			for ( ; i < j; i++ ) {
8290
				elem = this[i];
8291
				if ( elem.style ) {
8292
					display = jQuery.css( elem, "display" );
8293
8294
					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
8295
						jQuery._data( elem, "olddisplay", display );
8296
					}
8297
				}
8298
			}
8299
8300
			// Set the display of the elements in a second loop
8301
			// to avoid the constant reflow
8302
			for ( i = 0; i < j; i++ ) {
8303
				if ( this[i].style ) {
8304
					this[i].style.display = "none";
8305
				}
8306
			}
8307
8308
			return this;
8309
		}
8310
	},
8311
8312
	// Save the old toggle function
8313
	_toggle: jQuery.fn.toggle,
8314
8315
	toggle: function( fn, fn2, callback ) {
8316
		var bool = typeof fn === "boolean";
8317
8318
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8319
			this._toggle.apply( this, arguments );
8320
8321
		} else if ( fn == null || bool ) {
8322
			this.each(function() {
8323
				var state = bool ? fn : jQuery(this).is(":hidden");
8324
				jQuery(this)[ state ? "show" : "hide" ]();
8325
			});
8326
8327
		} else {
8328
			this.animate(genFx("toggle", 3), fn, fn2, callback);
8329
		}
8330
8331
		return this;
8332
	},
8333
8334
	fadeTo: function( speed, to, easing, callback ) {
8335
		return this.filter(":hidden").css("opacity", 0).show().end()
8336
					.animate({opacity: to}, speed, easing, callback);
8337
	},
8338
8339
	animate: function( prop, speed, easing, callback ) {
8340
		var optall = jQuery.speed( speed, easing, callback );
8341
8342
		if ( jQuery.isEmptyObject( prop ) ) {
8343
			return this.each( optall.complete, [ false ] );
8344
		}
8345
8346
		// Do not change referenced properties as per-property easing will be lost
8347
		prop = jQuery.extend( {}, prop );
8348
8349
		function doAnimation() {
8350
			// XXX 'this' does not always have a nodeName when running the
8351
			// test suite
8352
8353
			if ( optall.queue === false ) {
8354
				jQuery._mark( this );
8355
			}
8356
8357
			var opt = jQuery.extend( {}, optall ),
8358
				isElement = this.nodeType === 1,
8359
				hidden = isElement && jQuery(this).is(":hidden"),
8360
				name, val, p, e,
8361
				parts, start, end, unit,
8362
				method;
8363
8364
			// will store per property easing and be used to determine when an animation is complete
8365
			opt.animatedProperties = {};
8366
8367
			for ( p in prop ) {
8368
8369
				// property name normalization
8370
				name = jQuery.camelCase( p );
8371
				if ( p !== name ) {
8372
					prop[ name ] = prop[ p ];
8373
					delete prop[ p ];
8374
				}
8375
8376
				val = prop[ name ];
8377
8378
				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8379
				if ( jQuery.isArray( val ) ) {
8380
					opt.animatedProperties[ name ] = val[ 1 ];
8381
					val = prop[ name ] = val[ 0 ];
8382
				} else {
8383
					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8384
				}
8385
8386
				if ( val === "hide" && hidden || val === "show" && !hidden ) {
8387
					return opt.complete.call( this );
8388
				}
8389
8390 View Code Duplication
				if ( isElement && ( name === "height" || name === "width" ) ) {
8391
					// Make sure that nothing sneaks out
8392
					// Record all 3 overflow attributes because IE does not
8393
					// change the overflow attribute when overflowX and
8394
					// overflowY are set to the same value
8395
					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8396
8397
					// Set display property to inline-block for height/width
8398
					// animations on inline elements that are having width/height animated
8399
					if ( jQuery.css( this, "display" ) === "inline" &&
8400
							jQuery.css( this, "float" ) === "none" ) {
8401
8402
						// inline-level elements accept inline-block;
8403
						// block-level elements need to be inline with layout
8404
						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
8405
							this.style.display = "inline-block";
8406
8407
						} else {
8408
							this.style.zoom = 1;
8409
						}
8410
					}
8411
				}
8412
			}
8413
8414
			if ( opt.overflow != null ) {
8415
				this.style.overflow = "hidden";
8416
			}
8417
8418
			for ( p in prop ) {
8419
				e = new jQuery.fx( this, opt, p );
8420
				val = prop[ p ];
8421
8422
				if ( rfxtypes.test( val ) ) {
8423
8424
					// Tracks whether to show or hide based on private
8425
					// data attached to the element
8426
					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
8427
					if ( method ) {
8428
						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
8429
						e[ method ]();
8430
					} else {
8431
						e[ val ]();
8432
					}
8433
8434
				} else {
8435
					parts = rfxnum.exec( val );
8436
					start = e.cur();
8437
8438
					if ( parts ) {
8439
						end = parseFloat( parts[2] );
8440
						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8441
8442
						// We need to compute starting value
8443
						if ( unit !== "px" ) {
8444
							jQuery.style( this, p, (end || 1) + unit);
8445
							start = ( (end || 1) / e.cur() ) * start;
8446
							jQuery.style( this, p, start + unit);
8447
						}
8448
8449
						// If a +=/-= token was provided, we're doing a relative animation
8450
						if ( parts[1] ) {
8451
							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8452
						}
8453
8454
						e.custom( start, end, unit );
8455
8456
					} else {
8457
						e.custom( start, val, "" );
8458
					}
8459
				}
8460
			}
8461
8462
			// For JS strict compliance
8463
			return true;
8464
		}
8465
8466
		return optall.queue === false ?
8467
			this.each( doAnimation ) :
8468
			this.queue( optall.queue, doAnimation );
8469
	},
8470
8471
	stop: function( type, clearQueue, gotoEnd ) {
8472
		if ( typeof type !== "string" ) {
8473
			gotoEnd = clearQueue;
8474
			clearQueue = type;
8475
			type = undefined;
8476
		}
8477
		if ( clearQueue && type !== false ) {
8478
			this.queue( type || "fx", [] );
8479
		}
8480
8481
		return this.each(function() {
8482
			var index,
8483
				hadTimers = false,
8484
				timers = jQuery.timers,
8485
				data = jQuery._data( this );
8486
8487
			// clear marker counters if we know they won't be
8488
			if ( !gotoEnd ) {
8489
				jQuery._unmark( true, this );
8490
			}
8491
8492
			function stopQueue( elem, data, index ) {
8493
				var hooks = data[ index ];
8494
				jQuery.removeData( elem, index, true );
8495
				hooks.stop( gotoEnd );
8496
			}
8497
8498
			if ( type == null ) {
8499
				for ( index in data ) {
8500
					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
8501
						stopQueue( this, data, index );
8502
					}
8503
				}
8504
			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
8505
				stopQueue( this, data, index );
8506
			}
8507
8508
			for ( index = timers.length; index--; ) {
8509
				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
8510
					if ( gotoEnd ) {
8511
8512
						// force the next step to be the last
8513
						timers[ index ]( true );
8514
					} else {
8515
						timers[ index ].saveState();
8516
					}
8517
					hadTimers = true;
8518
					timers.splice( index, 1 );
8519
				}
8520
			}
8521
8522
			// start the next in the queue if the last step wasn't forced
8523
			// timers currently will call their complete callbacks, which will dequeue
8524
			// but only if they were gotoEnd
8525
			if ( !( gotoEnd && hadTimers ) ) {
8526
				jQuery.dequeue( this, type );
8527
			}
8528
		});
8529
	}
8530
8531
});
8532
8533
// Animations created synchronously will run synchronously
8534
function createFxNow() {
8535
	setTimeout( clearFxNow, 0 );
8536
	return ( fxNow = jQuery.now() );
8537
}
8538
8539
function clearFxNow() {
8540
	fxNow = undefined;
8541
}
8542
8543
// Generate parameters to create a standard animation
8544
function genFx( type, num ) {
8545
	var obj = {};
8546
8547
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
8548
		obj[ this ] = type;
8549
	});
8550
8551
	return obj;
8552
}
8553
8554
// Generate shortcuts for custom animations
8555
jQuery.each({
8556
	slideDown: genFx( "show", 1 ),
8557
	slideUp: genFx( "hide", 1 ),
8558
	slideToggle: genFx( "toggle", 1 ),
8559
	fadeIn: { opacity: "show" },
8560
	fadeOut: { opacity: "hide" },
8561
	fadeToggle: { opacity: "toggle" }
8562
}, function( name, props ) {
8563
	jQuery.fn[ name ] = function( speed, easing, callback ) {
8564
		return this.animate( props, speed, easing, callback );
8565
	};
8566
});
8567
8568
jQuery.extend({
8569 View Code Duplication
	speed: function( speed, easing, fn ) {
8570
		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
8571
			complete: fn || !fn && easing ||
8572
				jQuery.isFunction( speed ) && speed,
8573
			duration: speed,
8574
			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
8575
		};
8576
8577
		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8578
			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
8579
8580
		// normalize opt.queue - true/undefined/null -> "fx"
8581
		if ( opt.queue == null || opt.queue === true ) {
8582
			opt.queue = "fx";
8583
		}
8584
8585
		// Queueing
8586
		opt.old = opt.complete;
8587
8588
		opt.complete = function( noUnmark ) {
8589
			if ( jQuery.isFunction( opt.old ) ) {
8590
				opt.old.call( this );
8591
			}
8592
8593
			if ( opt.queue ) {
8594
				jQuery.dequeue( this, opt.queue );
8595
			} else if ( noUnmark !== false ) {
8596
				jQuery._unmark( this );
8597
			}
8598
		};
8599
8600
		return opt;
8601
	},
8602
8603
	easing: {
8604
		linear: function( p, n, firstNum, diff ) {
8605
			return firstNum + diff * p;
8606
		},
8607
		swing: function( p, n, firstNum, diff ) {
8608
			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
8609
		}
8610
	},
8611
8612
	timers: [],
8613
8614
	fx: function( elem, options, prop ) {
8615
		this.options = options;
8616
		this.elem = elem;
8617
		this.prop = prop;
8618
8619
		options.orig = options.orig || {};
8620
	}
8621
8622
});
8623
8624
jQuery.fx.prototype = {
8625
	// Simple function for setting a style value
8626
	update: function() {
8627
		if ( this.options.step ) {
8628
			this.options.step.call( this.elem, this.now, this );
8629
		}
8630
8631
		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
8632
	},
8633
8634
	// Get the current size
8635
	cur: function() {
8636
		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
8637
			return this.elem[ this.prop ];
8638
		}
8639
8640
		var parsed,
8641
			r = jQuery.css( this.elem, this.prop );
8642
		// Empty strings, null, undefined and "auto" are converted to 0,
8643
		// complex values such as "rotate(1rad)" are returned as is,
8644
		// simple values such as "10px" are parsed to Float.
8645
		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8646
	},
8647
8648
	// Start an animation from one number to another
8649
	custom: function( from, to, unit ) {
8650
		var self = this,
8651
			fx = jQuery.fx;
8652
8653
		this.startTime = fxNow || createFxNow();
8654
		this.end = to;
8655
		this.now = this.start = from;
8656
		this.pos = this.state = 0;
8657
		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8658
8659
		function t( gotoEnd ) {
8660
			return self.step( gotoEnd );
8661
		}
8662
8663
		t.queue = this.options.queue;
8664
		t.elem = this.elem;
8665
		t.saveState = function() {
8666
			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
8667
				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
8668
			}
8669
		};
8670
8671
		if ( t() && jQuery.timers.push(t) && !timerId ) {
8672
			timerId = setInterval( fx.tick, fx.interval );
8673
		}
8674
	},
8675
8676
	// Simple 'show' function
8677
	show: function() {
8678
		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
8679
8680
		// Remember where we started, so that we can go back to it later
8681
		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
8682
		this.options.show = true;
8683
8684
		// Begin the animation
8685
		// Make sure that we start at a small width/height to avoid any flash of content
8686
		if ( dataShow !== undefined ) {
8687
			// This show is picking up where a previous hide or show left off
8688
			this.custom( this.cur(), dataShow );
8689
		} else {
8690
			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
8691
		}
8692
8693
		// Start by showing the element
8694
		jQuery( this.elem ).show();
8695
	},
8696
8697
	// Simple 'hide' function
8698
	hide: function() {
8699
		// Remember where we started, so that we can go back to it later
8700
		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
8701
		this.options.hide = true;
8702
8703
		// Begin the animation
8704
		this.custom( this.cur(), 0 );
8705
	},
8706
8707
	// Each step of an animation
8708
	step: function( gotoEnd ) {
8709
		var p, n, complete,
8710
			t = fxNow || createFxNow(),
8711
			done = true,
8712
			elem = this.elem,
8713
			options = this.options;
8714
8715
		if ( gotoEnd || t >= options.duration + this.startTime ) {
8716
			this.now = this.end;
8717
			this.pos = this.state = 1;
8718
			this.update();
8719
8720
			options.animatedProperties[ this.prop ] = true;
8721
8722
			for ( p in options.animatedProperties ) {
8723
				if ( options.animatedProperties[ p ] !== true ) {
8724
					done = false;
8725
				}
8726
			}
8727
8728
			if ( done ) {
8729
				// Reset the overflow
8730
				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8731
8732
					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
8733
						elem.style[ "overflow" + value ] = options.overflow[ index ];
8734
					});
8735
				}
8736
8737
				// Hide the element if the "hide" operation was done
8738
				if ( options.hide ) {
8739
					jQuery( elem ).hide();
8740
				}
8741
8742
				// Reset the properties, if the item has been hidden or shown
8743
				if ( options.hide || options.show ) {
8744
					for ( p in options.animatedProperties ) {
8745
						jQuery.style( elem, p, options.orig[ p ] );
8746
						jQuery.removeData( elem, "fxshow" + p, true );
8747
						// Toggle data is no longer needed
8748
						jQuery.removeData( elem, "toggle" + p, true );
8749
					}
8750
				}
8751
8752
				// Execute the complete function
8753
				// in the event that the complete function throws an exception
8754
				// we must ensure it won't be called twice. #5684
8755
8756
				complete = options.complete;
8757
				if ( complete ) {
8758
8759
					options.complete = false;
8760
					complete.call( elem );
8761
				}
8762
			}
8763
8764
			return false;
8765
8766
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
8767
			// classical easing cannot be used with an Infinity duration
8768
			if ( options.duration == Infinity ) {
8769
				this.now = t;
8770
			} else {
8771
				n = t - this.startTime;
8772
				this.state = n / options.duration;
8773
8774
				// Perform the easing function, defaults to swing
8775
				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
8776
				this.now = this.start + ( (this.end - this.start) * this.pos );
8777
			}
8778
			// Perform the next step of the animation
8779
			this.update();
8780
		}
8781
8782
		return true;
8783
	}
8784
};
8785
8786
jQuery.extend( jQuery.fx, {
8787
	tick: function() {
8788
		var timer,
8789
			timers = jQuery.timers,
8790
			i = 0;
8791
8792
		for ( ; i < timers.length; i++ ) {
8793
			timer = timers[ i ];
8794
			// Checks the timer has not already been removed
8795
			if ( !timer() && timers[ i ] === timer ) {
8796
				timers.splice( i--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
8797
			}
8798
		}
8799
8800
		if ( !timers.length ) {
8801
			jQuery.fx.stop();
8802
		}
8803
	},
8804
8805
	interval: 13,
8806
8807
	stop: function() {
8808
		clearInterval( timerId );
8809
		timerId = null;
8810
	},
8811
8812
	speeds: {
8813
		slow: 600,
8814
		fast: 200,
8815
		// Default speed
8816
		_default: 400
8817
	},
8818
8819
	step: {
8820
		opacity: function( fx ) {
8821
			jQuery.style( fx.elem, "opacity", fx.now );
8822
		},
8823
8824
		_default: function( fx ) {
8825
			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8826
				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
8827
			} else {
8828
				fx.elem[ fx.prop ] = fx.now;
8829
			}
8830
		}
8831
	}
8832
});
8833
8834
// Adds width/height step functions
8835
// Do not set anything below 0
8836
jQuery.each([ "width", "height" ], function( i, prop ) {
8837
	jQuery.fx.step[ prop ] = function( fx ) {
8838
		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
8839
	};
8840
});
8841
8842
if ( jQuery.expr && jQuery.expr.filters ) {
8843
	jQuery.expr.filters.animated = function( elem ) {
8844
		return jQuery.grep(jQuery.timers, function( fn ) {
8845
			return elem === fn.elem;
8846
		}).length;
8847
	};
8848
}
8849
8850
// Try to restore the default display value of an element
8851
function defaultDisplay( nodeName ) {
8852
8853
	if ( !elemdisplay[ nodeName ] ) {
8854
8855
		var body = document.body,
8856
			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
8857
			display = elem.css( "display" );
8858
		elem.remove();
8859
8860
		// If the simple way fails,
8861
		// get element's real default display by attaching it to a temp iframe
8862
		if ( display === "none" || display === "" ) {
8863
			// No iframe to use yet, so create it
8864
			if ( !iframe ) {
8865
				iframe = document.createElement( "iframe" );
8866
				iframe.frameBorder = iframe.width = iframe.height = 0;
8867
			}
8868
8869
			body.appendChild( iframe );
8870
8871
			// Create a cacheable copy of the iframe document on first call.
8872
			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
8873
			// document to it; WebKit & Firefox won't allow reusing the iframe document.
8874
			if ( !iframeDoc || !iframe.createElement ) {
8875
				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
8876
				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
8877
				iframeDoc.close();
8878
			}
8879
8880
			elem = iframeDoc.createElement( nodeName );
8881
8882
			iframeDoc.body.appendChild( elem );
8883
8884
			display = jQuery.css( elem, "display" );
8885
			body.removeChild( iframe );
8886
		}
8887
8888
		// Store the correct default display
8889
		elemdisplay[ nodeName ] = display;
8890
	}
8891
8892
	return elemdisplay[ nodeName ];
8893
}
8894
8895
8896
8897
8898
var rtable = /^t(?:able|d|h)$/i,
8899
	rroot = /^(?:body|html)$/i;
8900
8901 View Code Duplication
if ( "getBoundingClientRect" in document.documentElement ) {
8902
	jQuery.fn.offset = function( options ) {
8903
		var elem = this[0], box;
8904
8905
		if ( options ) {
8906
			return this.each(function( i ) {
8907
				jQuery.offset.setOffset( this, options, i );
8908
			});
8909
		}
8910
8911
		if ( !elem || !elem.ownerDocument ) {
8912
			return null;
8913
		}
8914
8915
		if ( elem === elem.ownerDocument.body ) {
8916
			return jQuery.offset.bodyOffset( elem );
8917
		}
8918
8919
		try {
8920
			box = elem.getBoundingClientRect();
8921
		} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8922
8923
		var doc = elem.ownerDocument,
8924
			docElem = doc.documentElement;
8925
8926
		// Make sure we're not dealing with a disconnected DOM node
8927
		if ( !box || !jQuery.contains( docElem, elem ) ) {
8928
			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
8929
		}
8930
8931
		var body = doc.body,
8932
			win = getWindow(doc),
8933
			clientTop  = docElem.clientTop  || body.clientTop  || 0,
8934
			clientLeft = docElem.clientLeft || body.clientLeft || 0,
8935
			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
8936
			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
8937
			top  = box.top  + scrollTop  - clientTop,
8938
			left = box.left + scrollLeft - clientLeft;
8939
8940
		return { top: top, left: left };
8941
	};
8942
8943
} else {
8944
	jQuery.fn.offset = function( options ) {
8945
		var elem = this[0];
8946
8947
		if ( options ) {
8948
			return this.each(function( i ) {
8949
				jQuery.offset.setOffset( this, options, i );
8950
			});
8951
		}
8952
8953
		if ( !elem || !elem.ownerDocument ) {
8954
			return null;
8955
		}
8956
8957
		if ( elem === elem.ownerDocument.body ) {
8958
			return jQuery.offset.bodyOffset( elem );
8959
		}
8960
8961
		var computedStyle,
8962
			offsetParent = elem.offsetParent,
8963
			prevOffsetParent = elem,
8964
			doc = elem.ownerDocument,
8965
			docElem = doc.documentElement,
8966
			body = doc.body,
8967
			defaultView = doc.defaultView,
8968
			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
8969
			top = elem.offsetTop,
8970
			left = elem.offsetLeft;
8971
8972
		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
8973
			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
8974
				break;
8975
			}
8976
8977
			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
8978
			top  -= elem.scrollTop;
8979
			left -= elem.scrollLeft;
8980
8981
			if ( elem === offsetParent ) {
8982
				top  += elem.offsetTop;
8983
				left += elem.offsetLeft;
8984
8985
				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
8986
					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8987
					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8988
				}
8989
8990
				prevOffsetParent = offsetParent;
8991
				offsetParent = elem.offsetParent;
8992
			}
8993
8994
			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
8995
				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8996
				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8997
			}
8998
8999
			prevComputedStyle = computedStyle;
9000
		}
9001
9002
		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
9003
			top  += body.offsetTop;
9004
			left += body.offsetLeft;
9005
		}
9006
9007
		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
9008
			top  += Math.max( docElem.scrollTop, body.scrollTop );
9009
			left += Math.max( docElem.scrollLeft, body.scrollLeft );
9010
		}
9011
9012
		return { top: top, left: left };
9013
	};
9014
}
9015
9016
jQuery.offset = {
9017
9018
	bodyOffset: function( body ) {
9019
		var top = body.offsetTop,
9020
			left = body.offsetLeft;
9021
9022
		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
9023
			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9024
			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9025
		}
9026
9027
		return { top: top, left: left };
9028
	},
9029
9030
	setOffset: function( elem, options, i ) {
9031
		var position = jQuery.css( elem, "position" );
9032
9033
		// set position first, in-case top/left are set even on static elem
9034
		if ( position === "static" ) {
9035
			elem.style.position = "relative";
9036
		}
9037
9038
		var curElem = jQuery( elem ),
9039
			curOffset = curElem.offset(),
9040
			curCSSTop = jQuery.css( elem, "top" ),
9041
			curCSSLeft = jQuery.css( elem, "left" ),
9042
			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9043
			props = {}, curPosition = {}, curTop, curLeft;
9044
9045
		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9046
		if ( calculatePosition ) {
9047
			curPosition = curElem.position();
9048
			curTop = curPosition.top;
9049
			curLeft = curPosition.left;
9050
		} else {
9051
			curTop = parseFloat( curCSSTop ) || 0;
9052
			curLeft = parseFloat( curCSSLeft ) || 0;
9053
		}
9054
9055
		if ( jQuery.isFunction( options ) ) {
9056
			options = options.call( elem, i, curOffset );
9057
		}
9058
9059
		if ( options.top != null ) {
9060
			props.top = ( options.top - curOffset.top ) + curTop;
9061
		}
9062
		if ( options.left != null ) {
9063
			props.left = ( options.left - curOffset.left ) + curLeft;
9064
		}
9065
9066
		if ( "using" in options ) {
9067
			options.using.call( elem, props );
9068
		} else {
9069
			curElem.css( props );
9070
		}
9071
	}
9072
};
9073
9074
9075
jQuery.fn.extend({
9076
9077 View Code Duplication
	position: function() {
9078
		if ( !this[0] ) {
9079
			return null;
9080
		}
9081
9082
		var elem = this[0],
9083
9084
		// Get *real* offsetParent
9085
		offsetParent = this.offsetParent(),
9086
9087
		// Get correct offsets
9088
		offset       = this.offset(),
9089
		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9090
9091
		// Subtract element margins
9092
		// note: when an element has margin: auto the offsetLeft and marginLeft
9093
		// are the same in Safari causing offset.left to incorrectly be 0
9094
		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9095
		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9096
9097
		// Add offsetParent borders
9098
		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9099
		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9100
9101
		// Subtract the two offsets
9102
		return {
9103
			top:  offset.top  - parentOffset.top,
9104
			left: offset.left - parentOffset.left
9105
		};
9106
	},
9107
9108
	offsetParent: function() {
9109
		return this.map(function() {
9110
			var offsetParent = this.offsetParent || document.body;
9111
			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9112
				offsetParent = offsetParent.offsetParent;
9113
			}
9114
			return offsetParent;
9115
		});
9116
	}
9117
});
9118
9119
9120
// Create scrollLeft and scrollTop methods
9121 View Code Duplication
jQuery.each( ["Left", "Top"], function( i, name ) {
9122
	var method = "scroll" + name;
9123
9124
	jQuery.fn[ method ] = function( val ) {
9125
		var elem, win;
9126
9127
		if ( val === undefined ) {
9128
			elem = this[ 0 ];
9129
9130
			if ( !elem ) {
9131
				return null;
9132
			}
9133
9134
			win = getWindow( elem );
9135
9136
			// Return the scroll offset
9137
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
9138
				jQuery.support.boxModel && win.document.documentElement[ method ] ||
9139
					win.document.body[ method ] :
9140
				elem[ method ];
9141
		}
9142
9143
		// Set the scroll offset
9144
		return this.each(function() {
9145
			win = getWindow( this );
9146
9147
			if ( win ) {
9148
				win.scrollTo(
9149
					!i ? val : jQuery( win ).scrollLeft(),
9150
					 i ? val : jQuery( win ).scrollTop()
9151
				);
9152
9153
			} else {
9154
				this[ method ] = val;
9155
			}
9156
		});
9157
	};
9158
});
9159
9160
function getWindow( elem ) {
9161
	return jQuery.isWindow( elem ) ?
9162
		elem :
9163
		elem.nodeType === 9 ?
9164
			elem.defaultView || elem.parentWindow :
9165
			false;
9166
}
9167
9168
9169
9170
9171
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
9172
jQuery.each([ "Height", "Width" ], function( i, name ) {
9173
9174
	var type = name.toLowerCase();
9175
9176
	// innerHeight and innerWidth
9177
	jQuery.fn[ "inner" + name ] = function() {
9178
		var elem = this[0];
9179
		return elem ?
9180
			elem.style ?
9181
			parseFloat( jQuery.css( elem, type, "padding" ) ) :
9182
			this[ type ]() :
9183
			null;
9184
	};
9185
9186
	// outerHeight and outerWidth
9187
	jQuery.fn[ "outer" + name ] = function( margin ) {
9188
		var elem = this[0];
9189
		return elem ?
9190
			elem.style ?
9191
			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
9192
			this[ type ]() :
9193
			null;
9194
	};
9195
9196
	jQuery.fn[ type ] = function( size ) {
9197
		// Get window width or height
9198
		var elem = this[0];
9199
		if ( !elem ) {
9200
			return size == null ? null : this;
9201
		}
9202
9203
		if ( jQuery.isFunction( size ) ) {
9204
			return this.each(function( i ) {
9205
				var self = jQuery( this );
9206
				self[ type ]( size.call( this, i, self[ type ]() ) );
9207
			});
9208
		}
9209
9210
		if ( jQuery.isWindow( elem ) ) {
9211
			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
9212
			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
9213
			var docElemProp = elem.document.documentElement[ "client" + name ],
9214
				body = elem.document.body;
9215
			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
9216
				body && body[ "client" + name ] || docElemProp;
9217
9218
		// Get document width or height
9219
		} else if ( elem.nodeType === 9 ) {
9220
			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
9221
			return Math.max(
9222
				elem.documentElement["client" + name],
9223
				elem.body["scroll" + name], elem.documentElement["scroll" + name],
9224
				elem.body["offset" + name], elem.documentElement["offset" + name]
9225
			);
9226
9227
		// Get or set width or height on the element
9228
		} else if ( size === undefined ) {
9229
			var orig = jQuery.css( elem, type ),
9230
				ret = parseFloat( orig );
9231
9232
			return jQuery.isNumeric( ret ) ? ret : orig;
9233
9234
		// Set the width or height on the element (default to pixels if value is unitless)
9235
		} else {
9236
			return this.css( type, typeof size === "string" ? size : size + "px" );
9237
		}
9238
	};
9239
9240
});
9241
9242
9243
9244
9245
// Expose jQuery to the global object
9246
window.jQuery = window.jQuery = jQuery;
9247
9248
// Expose jQuery as an AMD module, but only for AMD loaders that
9249
// understand the issues with loading multiple versions of jQuery
9250
// in a page that all might call define(). The loader will indicate
9251
// they have special allowances for multiple jQuery versions by
9252
// specifying define.amd.jQuery = true. Register as a named module,
9253
// since jQuery can be concatenated with other files that may use define,
9254
// but not use a proper concatenation script that understands anonymous
9255
// AMD modules. A named AMD is safest and most robust way to register.
9256
// Lowercase jquery is used because AMD module names are derived from
9257
// file names, and jQuery is normally delivered in a lowercase file name.
9258
// Do this after creating the global so that if an AMD module wants to call
9259
// noConflict to hide this version of jQuery, it will work.
9260
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
9261
	define( "jquery", [], function () { return jQuery; } );
9262
}
9263
9264
9265
9266
})( window );
9267